Здравствуйте, yury.fedorov, Вы писали:
YF>Здравствуйте, LCR, Вы писали:
LCR>>Как?
YF>Я бы решил эту проблему так:
YF>class A YF>{
YF> // Changed implementation. YF> public int meth() { return localMeth(); }
YF> // Added. YF> private final int localMeth() { return 10; }
YF> // Changed implemenatation. YF> public void coolMeth() YF> { YF> System.out.println( this.localMeth() ); // !!! НЕ хочется, чтобы вот здесь сработал полиморфный вызов YF> } YF>}
YF>Такой способ никак не влияет на структуру наследования и приемлем как в случае, когда класс А — базовый, так и когда он потомок какого-то уже ранее определенного класса.
Ну естественно, данная (конкретная) задача решается рефакторингом. Но вопрос не в этом, вопрос в следующем: есть метод, есть вызов этого метода. Как в данной, конкретной точке сделать вызов этого метода неполиморфным?
Пока есть 2 решения
1. Создать новый финальный (приватный, статический) метод, дублируя (или перенося) функциональность.
2. Использовать трюк ykk, переопределяя все места, где используется данный метод meth() и где нужен неполиморфный вызов (с понятными ограничениями, которые накладывает использование super'а).
Изменить сигнатуру метода на (приватный, статический) не подходить, поскольку он меняет целиком метод и влияет на все точки вызова.