Допустим, у меня есть существующий код, который я хочу расширить, но также и избегать его максимально возможного изменения.
Где-то вокруг этого кода есть метод, который получает некоторый тип.
Engine.method(Base b)
Теперь я хочу расширить эту функциональность. Поэтому я расширяю Base до типа с именем Derived, который содержит еще несколько необходимых мне данных, и я также реализую другой метод, который получает тип Derived и делает с ним что-то другое.
Engine.method(Derived d)
Но я не хочу менять исходный вызов на «метод». Мне каким-то образом удалось создать экземпляр правильного типа (Base или Derived) с помощью флага, но, поскольку исходный вызов принимает Base, мой новый метод вызываться не будет.
Base b = null;
if(flag) {
b = new Derived()
} else{
b = new Base()
}
Engine.method(b)
Проблема в том, что теперь мой Engine.method (Derived d) больше не будет вызываться. Я обошел его, используя кастинг
if(flag)
Engine.method((Derived)b)
Но это неправильно и глупо. Есть предложения?
Я всегда могу сделать:
if(flag) {
Engine.methodForBase(new Base())
} else{
Engine.methodForDerived(new Derived())
}
Но можете ли вы придумать что-нибудь лучше?
Спасибо