У меня есть некоторый класс наследования SubClass
Мое текущее решение очень простое:
class SuperClass {
protected void m1() {
//TASK (calls m2())
}
private void m2() {
//...
}
}
class MidClass extends SuperClass {
protected void m1() {
//same TASK (calls m2())
super.m1();
}
private void m2() {
//...
}
}
class SubClass extends MidClass {
protected void m1() {
//same TASK (calls m2())
super.m1();
}
private void m2() {
//...
}
}
Могу ли я использовать какой-то механизм повторного использования кода вместо копирования ЗАДАЧИ?
Что-то вроде следующего, с m1 () только в SuperClass, не работает:
class SuperClass {
protected final void m1() {
//TASK (calls m2())
if (!(this.getClass().equals(SuperClass.class))) {
super.m1();
}
}
, потому что super.m1 () не ссылается на выполнение того же унаследованного метода вконтекст суперкласса, но для реализации переопределенного метода.Так как m1 () не существует в Object, я дополнительно получаю ошибку компилятора ...
Помещение TASK в защищенный метод final helper () в SuperClass и вызов helper () вместо копирования TASK не будут работать, с тех пор всегда вызывается SuperClass.m2 ().
Единственная альтернатива, о которой я могу думать, это медленная, сложная и небезопасная: использование токена типа в качестве параметра, например protected final void m1(Class<? extends SuperClass> clazz)
в SuperClass, и выполнение TASK черезотражением (требует сделать m2 () общедоступным статическим или использовать setAccessible (true) для m2 ()).
Знаете ли вы лучшее решение?АОП?Может быть, какая-то структура, где вы можете внедрить метод в классы (как в C #)?Или я что-то упустил ???