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

Абстрактные классы

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


Читайте также:
  1. IV. КОНФЕРЕНЦИИ, СЕМИНАРЫ-ПРАКТИКУМЫ, МАСТЕР-КЛАССЫ
  2. Абстрактные методы, абстрактные классы.
  3. Вопрос 51. Социально-экономические классы и структура общества.
  4. И КЛАССЫ ОПАСНОСТИ ЛЕКАРСТВЕННЫХ СРЕДСТВ В ВОЗДУХЕ
  5. Классификация арматуры. Классы арматуры
  6. КЛАССЫ ГЕРМЕТИЧНОСТИ

В настоящее время базовый класс Employee спроектирован так, что поставляет различные данные-члены своим наследникам, а также предлагает два виртуальных метода (GiveBonus() и DisplayStatus()), которые могут быть переопределены наследниками. Хотя все это хорошо и замечательно, у данного дизайна есть один неприятный побочный эффект: можно непосредственно создавать экземпляры базового класса Employee:

 

// Что это будет означать?

Employee X = new Employee();

 

В нашем примере базовый класс Employee имеет единственное назначение — определить общие члены для всех подклассов. По всем признакам вы не намерены позволять кому-либо создавать прямые экземпляры этого класса, поскольку тип Employee слишком общий по своей природе. «Просто сотрудников» у нас быть не должно – каждой из возможных категорий сотрудников соответствует свой класс.

Учитывая то, что многие базовые классы склонны быть довольно неопределенными сущностями, намного лучший дизайн для рассматриваемого примера не должен разрешать непосредственное создание в коде нового объекта Employee. В С# можно добиться этого с использованием ключевого слова abstract в определении класса, создавая, таким образом, абстрактный базовый класс:

(этот код вставляем в проект EmployeeExample, класс Employee, добавляем abstract в описании класса)

Задание!!!: протестировать, исправить возможные ошибки

 

После этого попытка создать экземпляр класса Employee приведет к ошибке во время компиляции:

// Ошибка! Нельзя создавать экземпляр абстрактного класса!

Employee X = new Employee();

На первый взгляд может показаться очень странным, зачем определять класс, экземпляр которого нельзя создать непосредственно.

Базовые классы (абстрактные или нет) очень полезны тем, что содержат общие данные и общую функциональность, которую могут использовать наследуемые типы.

Также следует понимать, что хотя непосредственно создать абстрактный класс нельзя, он все же присутствует в памяти, когда создан экземпляр его производного класса. Таким образом, совершенно нормально (и принято) для абстрактных классов определять любое количество конструкторов, вызываемых опосредованно при размещении в памяти экземпляров производных классов.

 


Дата добавления: 2015-07-25; просмотров: 133 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Ключевые слова virtual и override| Полиморфный интерфейс

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