Предположим, что у меня есть класс Monkey, который иногда должен приобретать экземпляр Банана. Способ, которым этот банан предоставляется, не представляет интереса обезьяны, но он инициирует получение бананов.
Теперь у меня есть как минимум три возможных способа подключения моей обезьяны к поставщику бананов. Каков наилучший способ сделать это?
1. Событие
Поднять событие Monkey.BananaNeeded
. Обработчик событий устанавливает свойство BananaNeededEventArgs.Banana
.
2. Интерфейс
Вызвать IBananaProvider.GetBanana
. Экземпляр IBananaProvider
вводится в обезьяне как аргумент конструктора или через свойство.
3. Делегат
Вызовите делегата типа System.Func<Banana>
. Делегат вводится в обезьяну как аргумент конструктора или через свойство. Это заманчиво, потому что это не требует объявления каких-либо дополнительных интерфейсов или классов, но, по-видимому, это не популярный выбор.