Я приведу пример, который выходит за рамки того, «что он делает», и расскажу, когда он может быть полезен.
Вам когда-нибудь нужен был один из ваших бизнес-классов, чтобы быть контейнером? Например, возможно, вы захотите сделать это:
Person aperson = new Person();
aperson.Add(anAddress);
aperson.Add(anAddress);
Если вы хотите, чтобы метод Add () выполнял некоторую бизнес-логику при вставке, у вас есть выбор. Либо вы реализуете все функции контейнера самостоятельно (фу), либо наследуете свой класс Person от контейнера:
public class Person : List<Address> { }
Теперь вы можете получить желаемое поведение при двух условиях:
- Не ссылайтесь на класс Person по его базовому типу (List) и ...
- Используйте ключевое слово 'new', чтобы скрыть операцию добавления базового списка.
Ключевое слово new необходимо, потому что List.Add (...) не является виртуальным. Это несколько нехорошо (возможно, плохо), но в данном конкретном случае в основном круто. В создаваемый вами метод «new Add (...)» вы включаете свою бизнес-логику, а затем вызываете базовый метод Add (...).
Хотите сделать это еще круче? Сделайте дерево:
public class Node : List<Node> { }
В видеоиграх я использовал этот прием при написании дерева игры.
person
Brent Arias
schedule
25.08.2011