Назад Вперед Содержание

Абстрактные методы 

В C# существует возможность описания в базовом классе методов, а их реализацию оставить «на потом». Такие методы называют абстрактными.

Класс, в котором имеется хотя бы один абстрактный метод, тоже называется абстрактным и такой класс может служить только в качестве базового класса. Создать объекты абстрактных классов невозможно, потому что там нет реализации абстрактных методов.

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

Все абстрактные методы обязательно должны быть замещены в производных классах

Очевидно, что абстрактные методы автоматически являются виртуальными 

Абстрактные методы пишутся с модификатором abstract
public abstract double Square();

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

Класс, в котором есть хотя бы один абстрактный метод, называется абстрактным

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

В таком классе могу быть и поля и обычные методы, которые могут наследоваться дочерними классами.

Для потомка такого класса есть две возможности - или он реализует все абстрактные методы базового класса (и в этом случае для такого класса-потомка мы сможем создавать его экземпляры), или он реализует не все абстрактные методы базового класса (в этом случае он является тоже абстрактным классом и единственная возможность его использования - это производить от него классы-потомки). При переопределении в производном классе такой метод также объявляется с модификатором override.

Наличие абстрактного метода позволяет реализовать принудительный полиморфизм. Дело в том, что производный класс обязан реализовать абстрактный метод (иначе этот класс остается абстрактным и должен быть описан как abstract). Абстрактные методы по умолчанию считаются описанными как virtual (указывать virtual даже нельзя).

Абстрактные методы также, как и виртуальные, являются частью полиморфного интерфейса. Но если в случае с виртуальными методами мы говорим, что класс-наследник наследует реализацию, то в случае с абстрактными методами наследуется интерфейс, представленный этими абстрактными методами.

Пример

Создадим абстрактный класс Figure, от которого производим два класса - Circle (класс окружностей) и Triangle (класс треугольников).

В классе Figure создадим три абстрактных метода

В дочернем классе Triangle:

В дочернем классе Circle:

В классе Program в цикле из пяти витков

Отработка

Пример из раздела 5.1

В реализации этого примера в разделе 5.1 методы Area (для подсчета площади) и Border (для подсчета длины окружности или периметра) в базовом классе было невозможно реализовать, они просто возвращали нулевые значения. Кроме того создавать объект класса Shape было лишено смысла. В реальности не существует геометрической фигуры как таковой. Есть круг, прямоугольник, квадрат, но просто фигуры нет. Однако же и круг, и квадрат, имеют что-то общее и являются фигурами.Такие ситуации встречаются, когда следует гарантировать невозможность создания объектов класса. В таком случае базовый класс следует сделать абстрактным, указав в его заголовке ключевое слово abstract.

Реализуем этот же проект, используя абстрактные классы.

Создадим абстрактный класс Shape, от которого производим два класса - Circle (класс окружностей) и Square (класс квадратов).

В классе Shape создадим два абстрактных метода

В классе Shape создадим обычный метод

В дочернем классе Square:

В дочернем классе Circle:

В классе Program

Отработка

Назад Вперед Содержание