扩展抽象类 - 实现抽象方法

时间:2013-08-21 14:58:26

标签: java inheritance

问候和致意!

我目前有一个抽象类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
     }
}

有没有办法跳过在子类中创建两个抽象方法的存根实现?我的意思是他们使用的唯一地方是被覆盖的方法。

感谢任何帮助!

7 个答案:

答案 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,那可能是因为没有继承链接但是它们应该实现相同的接口?