Я начал использовать преимущества C# 2.0, а именно анонимными делегатами
Допустим у нас есть такой код
/// какой-то интерфейс
public interface IFoo {
void DoSomething(int something);
}
/// класс-пользователь интерфейса IFoo
public class FooUser {
public void UseFoo(IFoo foo) {
foo.DoSomething(0);
}
}
можно попробовать классический способ — сделат несколько наследников от IFoo
/// вариант с подклассами- наследниками от интерфеса IFoo
public class Example_WithSubClasses {
// класс-наследник 1
public class Foo1 : IFoo {
public void DoSomething(int something) {
// делаем это первым способом
}
}
// класс-наследник 2
public class Foo2 : IFoo {
public void DoSomething(int something) {
// делаем это по-другому
}
}
// пример использования
public void Example() {
IFoo foo;
FooUser user = new FooUser();
// делаем это первым способом
foo = new Foo1();
user.UseFoo(foo);
// делаем это по-другому
foo = new Foo2();
user.UseFoo(foo);
}
}
Но каждый раз писать новый наследник лениво. Можно написать один наследник на все случаи жизни, используя второй способ
/// вариант с анонимными делегатами
public class Example_WithDelegates {
// класс-наследник, он будет один на все случаи
public class FooDelegate : IFoo {
public delegate void DoSomethingDelegate(int something);
private DoSomethingDelegate _doSomething;
// в конструктор передаем делегат, который будет вызываться при вызове IFoo.DoSomething()
public FooDelegate(DoSomethingDelegate doSomething) {
_doSomething = doSomething;
}
// IFoo.DoSomething()
public void DoSomething(int something) {
_doSomething(something);
}
}
// пример использования
public void Example() {
FooUser user = new FooUser();
user.UseFoo(new FooDelegate(delegate(int something) {
// делаем это первым способом
}));
user.UseFoo(new FooDelegate(delegate(int something) {
// делаем это по-другому
}));
}
}
Вопрос: какой способ лучше и понятнее? Не будет ли второй вариант труден для понимания?