Чем анонимные делегаты лучше наследования?
От: RUMACTEP Россия  
Дата: 22.09.06 09:18
Оценка:
Я начал использовать преимущества 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) {
                                        // делаем это по-другому
                                    }));
    }
}


Вопрос: какой способ лучше и понятнее? Не будет ли второй вариант труден для понимания?
Правило наименьшего удивления: Программа должна работать так, чтобы это вызывало наименьшее удивление у пользователя.
Построй свой мини-горд на http://rumactep.myminicity.com/
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.