Абстрактные классы
С наследованием тесно связан еще один важный механизм проектирования семейства классов - механизм абстрактных классов. Начну с определений. Определение. Класс называется абстрактным, если он имеет хотя бы один абстрактный метод. Определение. Метод называется абстрактным, если при определении метода задана его сигнатура, но не задана реализация метода. Объявление абстрактных методов и абстрактных классов должно сопровождаться модификатором abstract. Поскольку абстрактные классы не являются полностью определенными классами, нельзя создавать объекты абстрактных классов. Абстрактные классы могут иметь потомков, частично или полностью реализующих абстрактные методы родительского класса. Абстрактный метод представляет виртуальный метод, переопределяемый потомком, поэтому к ним применяется стратегия динамического связывания. Абстрактные классы являются одним из важнейших инструментов объектно-ориентированного проектирования классов. Проектирование типа данных начинается с описания абстрактного типа данных - АТД. Абстрактный класс является программной реализацией АТД. На этом уровне нет необходимости задавать представление данных - поля класса. Нужно лишь задать операции, выполняемые над данными, - сервисы класса, предоставляемые клиентам. При этом операции задаются с точностью до сигнатуры и спецификаций, но без их реализации. Абстрактный класс Stack Рассмотрим проектирование абстрактного класса Stack, описывающего стек целых чисел. Определим над стеком четыре основные операции - поместить элемент в стек, удалить элемент с вершины стека, прочитать элемент на вершине без его удаления, проверить стек на пустоту. Вот описание абстрактного класса Stack, хранящего целые числа: /// <summary> /// Абстрактный стек целых чисел /// Соперациями: Put, Remove, Item, IsEmpty /// </summary> public abstract class Stack { /// <summary> /// Втолкнуть элемент item в стек /// </summary> /// <param name="item">Целоечисло</param> public abstract void Put(int item);
/// <summary> /// Предусловие: Стек не пуст! /// Удалить элемент в вершине стека /// </summary> public abstract void Remove();
/// <summary> /// Предусловие: Стек не пуст! /// Прочитать элемент в вершине стека /// </summary> public abstract int Item();
/// <summary> /// Определить, пуст ли стек /// </summary> /// <returns>true, еслипуст, иначе false</returns> publicabstractboolIsEmpty(); } Описание класса содержит только сигнатуры методов класса и их спецификацию, заданную тэгами summary. Для операций Remove и Item заданы предусловия, предупреждающие о том, что операции определены только для не пустого стека. Ответственность за выполнение предусловий лежит на клиенте, работающем со стеком.
|