Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Сокрытие методов

Построение цепочки вызовов конструкторов с использованием this. | Инкапсуляция с использованием традиционных методов доступа и изменения | Инкапсуляция с использованием свойств .NET | Свойства, доступные только для чтения и только для записи | Статические свойства | Статические конструкторы | SetFullName (fullName); | Ключевое слово sealed | Ключевые слова virtual и override | Абстрактные классы |


Читайте также:
  1. IV. Установление методов и технологии ремонта ТС
  2. IX. Данные лабораторных и инструментальных методов исследования.
  3. Алгоритм выбора методов финансового оздоровления
  4. Анализ форм, средств, методов обучения на уроке (авторских методик)
  5. Влияние учения Сократа, Платона и Аристотеля на развитие методов ведения переговоров
  6. Вопрос 1. Понятие и классификация методов государственного управления
  7. Вопрос 3 - Типы производства и их количественная и качественная характеристика с точки зрения использования оборудования, оснастки, методов обработки и организации труда.

Язык С# предоставляет средство, логически противоположное переопределению методов, которое называется сокрытием (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 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Полиморфный интерфейс| Правила приведения к базовому и производному классу

mybiblioteka.su - 2015-2024 год. (0.009 сек.)