我的课程Dad
包含子类Son
。我想创建一个Dad
的子类和一个Son
的子类来覆盖Dad
的方法。
如果不重复代码,最好的方法是什么?我无法修改Dad
和Son
。
...鉴于
public class Dad {
public void doSomething() {}
}
public class Son extends Dad {
}
......我想创造......
public class DadSubclass extends Dad {
@Overrides
public void doSomething() {
// My code
}
}
public class SonSubclass extends Son {
@Overrides
public void doSomething() {
// My code
}
}
...不重复// My code
。
显而易见的解决方案是创建一个帮助器类并为它们调用它,但如果我想调用受保护的方法,那么这是有问题的,而且我不允许使用相同的包创建子类。
有更好的解决方案吗?
答案 0 :(得分:3)
创建一个公共助手类并调用它。
答案 1 :(得分:3)
假设您的代码没有访问成员变量,我只想将此代码放在静态实用程序类中。如果不是这种情况,您仍然可以通过传入一个共同的超类 - “爸爸”public static void mycode(Dad d)
来实现这一点。如果您需要在子类本身中使用特定变量,我会重新考虑您的类结构。
答案 2 :(得分:0)
你真正想要的是这样的事情:
class DadSonSubclass extends Dad, Son {
public void doSomething() {
//mycode
}
}
这是多重继承,Java不支持。因此,您唯一的选择是创建一个助手/实用程序类,这是完全可以接受的。如果需要调用protected方法,只需将Dad对象传递给helper类并创建公共回调方法即可访问此信息。
答案 3 :(得分:0)
可能更好,也许不是,取决于你的观点,但它肯定可以完成。将您的代码放入一个帮助器类中,并使用一个回调来让该帮助程序访问它所需的受保护方法:
interface Callback {
void foo();
void bar();
void one();
void two();
}
class Helper {
static void helpMe(Callback callback) {
// My code
}
}
class DadSubclass extends Dad {
@Override
public void doSomething() {
Helper.helpMe(new Callback() {
public void foo() {
DadSubclass.this.foo();
}
public void bar() {
DadSubclass.this.bar();
}
public void one() {
throw new UnsupportedOperationException("one() doesn't exist in Dad");
}
public void two() {
throw new UnsupportedOperationException("two() doesn't exist in Dad");
}
});
}
}
class SonSubclass extends Son {
@Override
public void doSomething() {
Helper.helpMe(new Callback() {
public void foo() {
SonSubclass.this.foo();
}
public void bar() {
SonSubclass.this.bar();
}
public void one() {
SonSubclass.this.one();
}
public void two() {
SonSubclass.this.two();
}
});
}
}