【问题标题】:Creating new Abstract Method vs Interface Method创建新的抽象方法与接口方法
【发布时间】:2014-08-16 19:35:12
【问题描述】:

问。如果您在未链接到接口的抽象类中创建抽象方法,您是否仍然遵循Program to an Interface的原则?

我已经为我创建的所有 UI 类使用了一个接口;但是,考虑到接口的原因,我看不到与我要创建的抽象方法和现有接口的直接关联。

通常,我会创建抽象方法并完成;但是,我想知道我是否违反了Program to an Interface的设计原则。

问。我应该为此创建另一个接口还是只使用抽象方法?

注意:这不是接口与抽象类的问题。

public abstract class BaseClass extends Clazz implements Interface {

    // 1 out of 4 interface methods are implemented here
    CustomObj getMode() { ... }

    // I am actually also thinking of taking that 1 method - getMode() - out of the 
    //     interface and implementing it as an implemented method without an interface. 

    // Method that made me ask this question!!
    abstract CustomObj getDefaultMode();    // Not related to the interface - Interface

}


public interface Interface {

    String getFirstNumber();
    String getSecondNumber();

    CustomObj getMode();  // This one is implemented in the BaseClass, but I think it no longer belongs in this role

    // CustomObj getDefaultMode();  // This one is not in Interface, but makes be believe I need a new Interface or just have them declared in an Abstract Class.

}

注意:我的基类更多是为了简化具体类中的代码。基类处理一些被覆盖的方法、辅助方法、初始化等......所以它不像一个接口,而是作为你的标准抽象类。

【问题讨论】:

    标签: java interface abstract-methods


    【解决方案1】:

    问。如果你在一个没有链接到接口的抽象类中创建抽象方法,你是否仍然遵循编程到接口的原则?

    答:抽象类也是一种接口**。这取决于您如何使用它:如果您将其用作某种接口 - 那么您仍然遵守该原则。如果 Abstract 类是在后代之间重用代码的技术工具 - 那么这就是一种违规。

    您始终可以添加Interface2 extends Interface 以反映此方法的额外功能。您提到了这个选项 - 如果 Abstract 类不是“接口”,这可能是有意义的。

    有一种为不同的访问级别创建层次结构接口的模式。例如:

    • User 接口 - 用户详细信息的只读访问
    • UserMaintainance extends User 接口 - 还允许更新用户详细信息。

    看来你的情况可能属于这个定义。

    ** 例如,在编写 SPI 时,有时最好将接口作为抽象类,这样您就可以保持与旧版本的向后兼容性。

    【讨论】:

      【解决方案2】:

      抽象类可能是诀窍,但正如Growing Object-Oriented Software, Guided by Tests 书中所建议的那样,它会影响单元测试级别:

      不要模拟混凝土类

      Abstract 类的使用可能不会非常明确地显示与其合作者的各种潜在关系。

      这里有一个关于这个主题的question,我之前问过这个问题,以便进一步了解。

      你会告诉我:“但抽象类不是具体类!”
      我会调用一个具体的类,每个类收集一些行为以形成一个实体。
      抽象类通常会实现属于不同职责的多个方法,从而降低对象协作者的显式性。

      因此,我将“Programming by roles”改写为“Programming to an interface”。

      【讨论】:

      • 你能解释一下你编辑的内​​容吗?我只是有点理解它。
      【解决方案3】:

      我认为问题的措辞过于抽象,无法给出明确的是或否答案。

      一般来说抽象类没有什么问题。问题是当人们滥用它们时。我们如何定义滥用?或者更确切地说,抽象类的正确用途是什么?

      为此,我们必须记住,OO 是一种对“现实世界”进行建模的方式:好的设计提供易于理解的模型,而糟糕的设计则难以遵循。此外,好的 OO 设计可以扩展到建模问题也可能扩展的方向。 (我这里显然不是在谈论 extends 关键字。)

      抽象方法是这样说的:在这个类中声明的其他方法没有这个就没有意义。而接口的意思是,要成为 X,您至少需要这些方法。

      因此,虽然抽象方法是表达实现需求的一种方式,但接口定义了实现它的任何人都可以扮演的角色。

      有时你需要一个,有时你需要另一个。

      【讨论】:

        【解决方案4】:

        抽象方法可以被保护。接口方法不行。

        【讨论】:

          猜你喜欢
          • 2013-07-21
          • 2013-01-19
          • 2011-06-13
          • 1970-01-01
          • 1970-01-01
          • 2018-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多