Поскольку абстрактный класс может содержать функциональность (в отличие от интерфейса), он может иметь закрытые переменные или методы.
В вашем примере вы можете сделать что-то вроде
public void startEngine(){
injectFuel();
igniteSpark();
// etc. my understanding of engines is limited at best
System.out.println("Start Engine");
}
private void injectFuel() {}
private void igniteSpark() {}
Таким образомВы можете распространить часть работы на другие методы (чтобы у вас не было 1000-строчного метода startEngine), но вы не хотите, чтобы дети могли вызывать injectFuel отдельно, поскольку это не имеет смысла вне контекстаstartEngine (вы хотите убедиться, что он используется только там).
Или даже больше, у вас может быть закрытый метод, который вызывается в нескольких других открытых методах с другими параметрами.Таким образом, вы избегаете написания одного и того же кода дважды или более в каждом из открытых методов, а группировка общего кода в закрытом методе гарантирует, что дети не получат к нему доступ (как если бы они не могли просто вызвать часть открытого метода раньше).).Примерно так:
public void startEngine() {
dishargeBattery(50);
System.out.println("Start Engine");
}
public void startRadio() {
dischargeBattery(20);
}
private void dischargeBattery(int value) {
battery.energy -= value; //battery should probably be a private field.
}
Таким образом, ваши методы могут иметь доступ к батарее, но дети не должны связываться с ней, и вы не пишете одну и ту же строку (battery.energy -= value
) в обоихиз них.Заметьте, однако, что это очень простые примеры, но если бы метод dumpBattery представлял собой метод с 500 строками, записать его в обоих других методах было бы непросто.