Я не претендую на право быть правым, но давайте посмотрим на этот небольшой пример:
public interface CarConstants {
static final String ENGINE = "mechanical";
static final String WHEEL = "round";
// ...
}
public interface ToyotaCar extends CarConstants //, ICar, ... {
void produce();
}
public interface FordCar extends CarConstants //, ICar, ... {
void produce();
}
// and this is implementation #1
public class CamryCar implements ToyotaCar {
public void produce() {
System.out.println("the engine is " + ENGINE );
System.out.println("the wheel is " + WHEEL);
}
}
// and this is implementation #2
public class MustangCar implements FordCar {
public void produce() {
System.out.println("the engine is " + ENGINE );
System.out.println("the wheel is " + WHEEL);
}
}
ToyotaCar ничего не знает о FordCar, а FordCar не знает о ToyotaCar. Принцип CarConstants должен быть изменен, но ...
Константы не должны изменяться, потому что колесо круглое, а egine механическое, но ...
В будущем инженеры Toyota разработали электронный двигатель и плоские колеса! Давайте посмотрим наш новый интерфейс
public interface InnovativeCarConstants {
static final String ENGINE = "electronic";
static final String WHEEL = "flat";
// ...
}
и теперь мы можем изменить нашу абстракцию:
public interface ToyotaCar extends CarConstants
до
public interface ToyotaCar extends InnovativeCarConstants
И теперь, если нам когда-нибудь понадобится изменить значение ядра, если ДВИГАТЕЛЬ или КОЛЕСО, мы можем изменить интерфейс ToyotaCar на уровне абстракции, не затрагивая реализации
Это НЕ БЕЗОПАСНО, я знаю,
но я все еще хочу знать, что вы думаете об этом