Да, можно предоставлять переменные-члены в абстрактном базовом классе с намерением, чтобы его подклассы использовали эти члены для создания конкретной реализации.
Вот конкретный пример использования автомобильной аналогии, которую мы все полюбили.
Допустим, мы делаем Car
абстрактный базовый класс, который имеет заполнители для колес, шасси и двигателя для своих подклассов:
abstract class Car {
Wheels wheels
Chassis chassis
Engine engine
abstract void accelerate();
abstract void decelerate();
}
Теперь, для класса, который расширяет Car
, члены уже существуют для использования, поэтому подкласс отвечает за заполнение этих переменных-членов:
class NiceCar extends Car {
Decoration decoration;
public NiceCar() {
wheels = new ChromeWheels();
chassis = new LightweightCompositeChassis();
engine = new LotsOfHorsepowerEngine();
decoration = new CoolRacingStripes();
}
void accelerate() {
engine.feedFuel();
}
void decelerate() {
wheels.applyBrakes();
}
}
Как видно, абстрактный базовый класс может работать как план, для которого компоненты (переменные-члены) должны быть заполнены, чтобы получить полную функциональность класса. В этом случае Car
предоставляет базовые части автомобиля для конкретной реализации. NiceCar
использует эти поля-члены и добавляет некоторые для своих собственных функций, например для задания декоративной окраски.