Абстрактный класс является базовым классом, но это базовый класс, который обычно имеет некоторые абстрактные члены. Это позволяет вам писать код в абстрактном классе, который вызывает этих абстрактных членов, но без какой-либо реализации ... затем он заставляет конкретные классы, производные от абстрактного класса, реализовать эти члены.
Преимущества наличия абстрактного класса, а не просто конкретного базового класса, в который некоторые члены выдают NotImplementException
s:
- Производные классы вынуждены (во время компиляции) реализовывать соответствующие члены
- Клиенты не могут просто создать экземпляр базового класса; они должны использовать конкретный класс, который предоставляет соответствующие «отсутствующие» члены.
Как пример, на днях я написал класс абстрактного класса, расширяющий JsonConverter
в Json.NET. Цель состояла в том, чтобы он был базовым классом для любых преобразователей для структур в моем проекте - он обрабатывал бы все конвертируемые типы, допускающие значения NULL (и десериализовывал пустой JSON в нулевое значение), оставляя производные классы свободными до всего сосредоточиться на типовой части. Посмотрите на это (NodaConverterBase
) и посмотрите, не прояснит ли это что-то.