Читайте также: |
|
В настоящее время базовый класс 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 | | | Полиморфный интерфейс |