1

问候和问候!

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

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

任何帮助表示赞赏!

4

7 回答 7

5

不可以。如果你扩展一个抽象类,你必须要么使子类抽象,要么它必须履行父类的契约。

作为设计观察,我建议您尝试将 oneMethod() 设为最终的或抽象的。很难维护允许以您实现它的方式进行扩展的程序。使用其他抽象方法将子类挂钩到 oneMethod() 的功能中。

于 2013-08-21T15:03:53.170 回答
2

您必须为所有抽象方法提供实现。即使现在程序的任何部分都没有调用它们,将来也可以创建一个调用它们的类,或者超类的实现可能会改变。即使只是为了二进制兼容性,也需要存根。

于 2013-08-21T15:02:51.123 回答
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比你需要的更多。

于 2013-08-21T15:09:24.240 回答
1

只需使 B 类也抽象。

public abstract class B extends AbstractA {
于 2013-08-21T15:10:38.637 回答
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

于 2013-08-21T15:14:11.260 回答
0

好吧,如果abstractMethodTwoabstractMethodOne是特定于实现的,为什么要将这些方法放在基本抽象类中?也许您正在寻找一个通用界面或一些特定的设计模式!

于 2013-08-21T15:04:57.343 回答
0

如果您的类 B 和 A 必须实现自己的 oneMethod 可能是因为没有继承链接,但它们应该实现相同的接口?

于 2013-08-21T15:06:39.290 回答