6

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

我已经为我创建的所有 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.

}

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

4

4 回答 4

3

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

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

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

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

  • Userinterface - 用户详细信息的只读访问权限
  • UserMaintainance extends User界面 - 还允许更新用户详细信息。

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

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

于 2014-08-16T20:04:05.780 回答
2

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

不要模拟混凝土类

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

这是我之前问过的关于这个主题的一个问题,以进一步了解这一点。

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

因此,我将通过“按角色编程”来改写“对接口编程”。

于 2014-08-16T20:25:30.983 回答
1

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

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

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

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

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

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

于 2014-08-16T20:33:24.507 回答
0

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

于 2019-03-15T12:41:45.120 回答