<Implementation>
public delegate void Printer<T>(T data);
public static class BufferExtension
{
public static void Dump<T>(this IBuffer<T> buffer, Printer<T> print)
{
foreach (var item in buffer)
{
print(item);
}
}
}
Action , Func , Predicate
Action : 적어도 한개 이상의 generic parameter를 갖고 void return
Fcun : 적어도 한개 이상의 generic parameter를 갖고 마지막 generic parameter의 형태로 return 한다.
Predicate : 한개의 generic parameter를 갖고 bool 타입의 return 을 한다.
printBool(isLessThanTen(sqare(add(3, 5))));
{
Console.WriteLine("My action print");
};
myprint();
Action<bool> printBool = d => Console.WriteLine(d);
Func<double, double> sqare = d => d * d;
Func<double, double,double > add = (x, y) => x + y;
Predicate<double> isLessThanTen = d => d < 10;
printBool(isLessThanTen(sqare(add(3, 5))));
Generic Event Handler
public class CircularBuffer<T> : Buffer<T>
{
int _capacity;
public CircularBuffer(int capacity = 10)
{
_capacity = capacity;
}
public override void Write(T value)
{
base.Write(value);
if (_queue.Count > _capacity)
{
var discard = _queue.Dequeue();
OnItemDiscarded(discard, value);
}
}
private void OnItemDiscarded(T discard, T value)
{
if(ItemDiscarded != null)
{
var args = new ItemDiscardedEventArgs<T>(discard, value);
ItemDiscarded(this, args);
}
}
public event EventHandler<ItemDiscardedEventArgs<T>> ItemDiscarded;
public bool IsFull { get { return _queue.Count == _capacity; } }
}
public class ItemDiscardedEventArgs<T> : EventArgs
{
public ItemDiscardedEventArgs(T discard, T newitem)
{
ItemDiscarded = discard;
NewItem = newitem;
}
public T ItemDiscarded { get; set; }
public T NewItem { get; set; }
}
[Impementation]
static void Main(string[] args)
{
var buffer = new CircularBuffer<double>(capacity:3);
buffer.ItemDiscarded += ItemDiscarded;
ProcessInput(buffer);
buffer.Dump(d => Console.WriteLine(d));
ProcessBuffer(buffer);
}
static void ItemDiscarded(object sender, ItemDiscardedEventArgs<double> e)
{
Console.WriteLine("Buffer full. Discarding {0} New item is {1}",
e.ItemDiscarded, e.NewItem
);
}
프로그램 설명 :
지정된 용량 3 이상의 값이 buffer에 입력이 되어 삭제되는 buffer 값과 새롭게 입력되는 buffer의 값을 ItemDiscarded event handler를 수행한다.
전달되는 EventArgs 는 generic으로 선언되어 있음.