В C# существует возможность описания в базовом классе методов, а их реализацию оставить «на потом». Такие методы называют абстрактными.
Класс, в котором имеется хотя бы один абстрактный метод, тоже называется абстрактным и такой класс может служить только в качестве базового класса. Создать объекты абстрактных классов невозможно, потому что там нет реализации абстрактных методов.
Чтобы класс – наследник абстрактного класса не был в свою очередь абстрактным (хотя и это не запрещено), там должны содержаться переопределения всех наследованных абстрактных методов.
Все абстрактные методы обязательно должны быть замещены в производных классах
Очевидно, что абстрактные методы автоматически являются виртуальными
Абстрактные методы пишутся с модификатором abstract
public abstract double Square(); |
Класс, в котором есть хотя бы один абстрактный метод, называется абстрактным
Нельзя создавать экземпляры абстрактного класса - такой класс может использоваться только в качестве базового класса для других классов.
В таком классе могу быть и поля и обычные методы, которые могут наследоваться дочерними классами.
Для потомка такого класса есть две возможности - или он реализует все абстрактные методы базового класса (и в этом случае для такого класса-потомка мы сможем создавать его экземпляры), или он реализует не все абстрактные методы базового класса (в этом случае он является тоже абстрактным классом и единственная возможность его использования - это производить от него классы-потомки). При переопределении в производном классе такой метод также объявляется с модификатором override.
Наличие абстрактного метода позволяет реализовать принудительный полиморфизм. Дело в том, что производный класс обязан реализовать абстрактный метод (иначе этот класс остается абстрактным и должен быть описан как abstract). Абстрактные методы по умолчанию считаются описанными как virtual (указывать virtual даже нельзя).
Абстрактные методы также, как и виртуальные, являются частью полиморфного интерфейса. Но если в случае с виртуальными методами мы говорим, что класс-наследник наследует реализацию, то в случае с абстрактными методами наследуется интерфейс, представленный этими абстрактными методами.
Создадим абстрактный класс Figure, от которого производим два класса - Circle (класс окружностей) и Triangle (класс треугольников).
Отработка
В реализации этого примера в разделе 5.1 методы Area (для подсчета площади) и Border (для подсчета длины окружности или периметра) в базовом классе было невозможно реализовать, они просто возвращали нулевые значения. Кроме того создавать объект класса Shape было лишено смысла. В реальности не существует геометрической фигуры как таковой. Есть круг, прямоугольник, квадрат, но просто фигуры нет. Однако же и круг, и квадрат, имеют что-то общее и являются фигурами.Такие ситуации встречаются, когда следует гарантировать невозможность создания объектов класса. В таком случае базовый класс следует сделать абстрактным, указав в его заголовке ключевое слово abstract.
Реализуем этот же проект, используя абстрактные классы.
Создадим абстрактный класс Shape, от которого производим два класса - Circle (класс окружностей) и Square (класс квадратов).
Отработка