【问题标题】:Abstract class Implementation抽象类实现
【发布时间】:2021-04-08 19:26:59
【问题描述】:

我有一个抽象类,如下所示。对于这个抽象类,我有 2 个具体类。我的问题是其中 1 个具体类需要实现 class2 不需要的方法。所以我不想在抽象类中调用该方法,因为并非所有的混凝土都依赖于它。但是调用代码会调用抽象类中的execute()方法。它是程序的入口点。我的问题是我将如何重构它

Abstract class A{

    abstract void doOne();
    abstract void doTwo();

    public void execute(){
        //.... Lots of common code used by both Class1 and Class2
        doOne();
        //....
        doTwo()
        //...
        //Method should only be implemented by Class 1 and not by Class 2
        CallOnlyClass1()
    }

}

Class class1 extends A{

}

Class class2 extends A{

【问题讨论】:

  • 在类 1 中,重写方法,并在其中调用 super 版本。然后只做它应该做的事情。
  • class2 仍然可以拥有该方法,但主体为空。这通常被称为a template method(尽管它通常有更多的肉)。
  • 好的,谢谢。我试图避免这种情况,但我想这是最好的选择
  • @Mguy 你忘了这个问题了吗? :P

标签: java design-patterns interface abstract-class


【解决方案1】:

为了避免在抽象中泄露具体细节并因此使设计变得不那么笨拙,您可以做的就是使扩展点不那么具体。

例如,如果您将方法命名为postExecute,那么您允许Class2 在该扩展点中调用它自己的方法。如果postExecute 并不总是需要实现,那么您可以在抽象类中有一个默认的空实现。

在不了解具体模型和问题的情况下,我无法真正提出替代设计,但您也可以尝试使用组合而不是继承和模板方法进行探索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 2012-07-17
    • 1970-01-01
    • 2013-05-30
    相关资源
    最近更新 更多