Рассмотрим пример, представленный на рисунке 2.19. В нем
рассмотрена операция подсчет выплат для различных категорий служащих фирмы:
временных служащих с почасовой оплатой труда, постоянных служащих с понедельной
оплатой труда и руководящих работников фирмы с помесячной оплатой.
Каждая из категорий служащих представлена своим подклассом
класса служащий, от которого они наследуют атрибут годовой_доход и операцию
подсчет_выплат. Но подсчет выплат для каждой категории служащих производится
по-своему, с учетом значений их собственных (неунаследованных) атрибутов;
поэтому в каждом из подклассов операция подсчет_выплат переопределяется.
Следовательно, в суперклассе операция подсчет_выплат может быть определена
произвольным образом, так как она никогда не будет выполняться. В то же время
сигнатуры всех операций подсчет_выплат в суперклассе и в подклассах должны быть
одинаковыми (иначе это будут разные операции). Из сказанного следует, что в
суперклассе можно задать только сигнатуру операции подсчет_выплат, это обеспечит
одинаковые сигнатуры этой операции во всех подклассах. Методы, реализующие
операцию подсчет_выплат, достаточно определить только в подклассах класса
служащий. Суперкласс, в котором заданы только атрибуты и сигнатуры операций, но
не определены методы, реализующие его операции, называется абстрактным
классом. Методы, реализующие операции абстрактного класса, определяются в
его подклассах, которые называются конкретными классами.
Рис. 2.19. Абстрактный класс
Абстрактный класс не может иметь объектов, так как в нем не
определены операции над объектами; объекты должны принадлежать конкретным
подклассам абстрактного класса. Абстрактные классы используются для спецификации
интерфейсов операций (методы, реализующие эти операции впоследствии определяются
в подклассах абстрактного класса). Абстрактные классы удобны на фазе анализа
требований к системе, так как они позволяют выявить аналогию в различных, на
первый взгляд, операциях, определенных в анализируемой системе.
|