Читайте также:
|
|
Язык С# предоставляет средство, логически противоположное переопределению методов, которое называется сокрытием (shadowing). Выражаясь формально, если производный класс определяет метод, который идентичен методу, определенному в базовом классе, то производный класс скрывает родительскую версию. В реальном мире такая ситуация чаще всего возникает при наследовании от класса, который создавали не вы (и не ваша команда), например, в случае приобретения пакета программного обеспечения. NET у независимого поставщика.
Для иллюстрации предположим, что вы получили от коллеги класс по имени ThreeDCircle, в котором определен метод по имени Draw(), не принимающий аргументов:
Вы обнаруживаете, что ThreeDCircle "является" Circle, поэтому наследуете его от существующего типа Circle:
После компиляции в окне ошибок Visual Studio появляется предупреждение.
Проблема в том, что в производном классе (ThreeDCircle) присутствует метод, идентичный унаследованному методу. Точное предупреждение компилятора в этом случае будет таким:
Shapes.ThreeDCircle.Draw() - скрывает унаследованный член Shapes.Circle.Draw(). Чтобы заставить текущий член переопределить эту реализацию, добавьте ключевое слово override. В противном случае добавьте ключевое слово new.
Существует два способа решения этой проблемы. Можно просто обновить родительскую версию Draw(), используя ключевое слово override (как рекомендует компилятор). При таком подходе тип ThreeDCircle может расширять родительское поведение по умолчанию, как и требовалось. Однако если доступ к коду, определяющему базовый класс, отсутствует (как обычно случается с библиотеками от независимых поставщиков), то нет возможности модифицировать метод Draw(), сделав его виртуальным.
В качестве альтернативы можно добавить ключевое слово new в определение члена Draw() производного типа (ThreeDCircle в данном случае). Делая это явно, вы устанавливаете, что реализация производного типа преднамеренно спроектирована так, чтобы игнорировать родительскую версию (в реальном проекте это может помочь, если внешнее программное обеспечение .NET каким-то образом конфликтует с вашим программным обеспечением).
(этот код вставляем в проект ShapeExample, пространство имен Shape)
Задание!!!: протестировать, исправить возможные ошибки
Можно также применить ключевое слово new к любому члену типа, унаследованному от базового класса (полю, константе, статическому члену или свойству). В качестве еще одного примера предположим, что ThreeDCircle () желает скрыть унаследованное поле shapeName:
(этот код вставляем в проект ShapeExample, редактируем класс ThreeDCircle)
Задание!!!: протестировать, исправить возможные ошибки
И, наконец, имейте в виду, что всегда можно обратиться к реализации базового класса скрытого члена, используя явное приведение (описанное в следующем разделе).
Например, это демонстрируется в следующем коде:
Дата добавления: 2015-07-25; просмотров: 109 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Полиморфный интерфейс | | | Правила приведения к базовому и производному классу |