问候和致意!
我目前有一个抽象类A,并且有许多类继承它。我在oneMethod()中放入的所有子类共有的代码,以及特定于每个实现的代码,我将它放入两个抽象方法中。
public abstract class AbstractA {
public oneMethod() {
//do some intelligent stuff here
abstractMethodOne();
abstractMethodTwo();
}
protected abstract void abstractMethodOne();
protected abstract void abstractMethodTwo();
}
我有一个覆盖oneMethod()方法的类。
public class B extends AbstractA {
@Override
public oneMethod() {
//do some other intelligent stuff here
}
}
有没有办法跳过在子类中创建两个抽象方法的存根实现?我的意思是他们使用的唯一地方是被覆盖的方法。
感谢任何帮助!
答案 0 :(得分:5)
没有。如果扩展抽象类,则必须使子类为抽象类,或者必须满足父类的约定。
作为设计观察,我建议您尝试将oneMethod()设为final或abstract。很难维护允许扩展的程序,就像你实现它一样。使用其他抽象方法将子类挂钩到oneMethod()的功能中。
答案 1 :(得分:2)
您必须为所有抽象方法提供实现。即使程序中没有任何部分现在调用它们,也可以在将来创建一个调用它们的类,或者可以更改超类实现。即使它仅用于二进制兼容性,也需要存根。
答案 2 :(得分:2)
您可以将oneMethod
拉入超类:
public abstract class AbstractC {
public void oneMethod() {
}
}
public abstract class AbstractA extends AbstractC {
@Override
public void oneMethod() {
//do some intelligent stuff here
abstractMethodOne();
abstractMethodTwo();
}
protected abstract void abstractMethodOne();
protected abstract void abstractMethodTwo();
}
public class B extends AbstractC {
@Override
public void oneMethod() {
//do some other intelligent stuff here
}
}
立即查看AbstractC
中您不再需要的内容。
答案 3 :(得分:1)
只要让B级也抽象化。
public abstract class B extends AbstractA {
答案 4 :(得分:1)
由于abstractMethodOne()
和abstractMethodTwo()
是特定于实现的,但您知道您将始终调用它们,您可以使用这样的组合:
public interface SomeInterface {
void abstractMethodOne();
void abstractMethodTwo();
}
并创建一个这样的类:
public class SomeClass {
public void executeThem(SomeInterface onSomeObject) {
onSomeObject.abstractMethodOne();
onSomeObject.abstractMethodTwo();
}
}
然后你可以在任何你应该调用这些方法的类中编写它:
public class SomeImplementation implements SomeInterface {
public void abstractMethodOne() {
// ...
}
public void abstractMethodTwo() {
// ...
}
public void executeThem() {
new SomeClass().executeThem(this);
}
}
这样你完全摆脱了继承,你可以在实现SomeInterface
的类中更灵活。
答案 5 :(得分:0)
那么,如果 abstractMethodTwo 和 abstractMethodOne 是特定于实现的,为什么要将这些方法放在基本抽象类中呢?也许你正在寻找一个常见的界面或一些特定的设计模式!
答案 6 :(得分:0)
如果您的B和A类必须实现自己的oneMethod,那可能是因为没有继承链接但是它们应该实现相同的接口?