创建新的抽象方法与接口方法

时间:2014-08-16 19:35:13

标签: java interface abstract-methods

Q值。如果要在未链接到接口的抽象类中创建抽象方法,您是否仍遵循编程到接口的原则?

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

通常,我会创建抽象方法并完成;但是,我想知道我是否违反程序到接口的设计原则

问。我应该为此创建另一个界面还是坚持使用抽象方法?

注意: 这不是界面与抽象类问题。

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.

}

注意:My Base类更多用于简化具体类中的代码。基类处理一些重写的​​方法,辅助方法,初始化等...所以它不像接口那样,而是作为标准的抽象类。

4 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

**例如,在编程SPI时,将接口设置为抽象类有时会更好,因此可以保持与旧版本的向后兼容性。

答案 1 :(得分:2)

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

不要模拟混凝土类

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

以下是关于这个问题的question,我几次问过这个问题,进一步了解这个问题。

你会告诉我:“但是一个抽象的课程不是具体的课程!” 我会称一个具体的课程,每一个收集某些行为的课程,以便出现一个实体。
抽象类可能经常实现属于各种职责的几种方法,因此降低了对象协作者的显性。

因此,我将“按角色编程”改写为“编程到界面”。

答案 2 :(得分:1)

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

一般来说,抽象类没有任何问题。麻烦在于人们滥用它们。我们如何定义滥用?或者更确切地说,抽象类的正确使用是什么?

为此,我们必须记住OO是一种模拟“现实世界”的方式:好的设计提供易于理解的模型,糟糕的设计很难遵循。此外,良好的OO设计可以在模拟问题可能扩展的方向上扩展。 (我现在不是在谈论extends关键字。)

抽象方法的含义如下:没有这个方法,在这个类中声明的其他方法没有任何意义。虽然接口所说的是X,但至少需要这些方法。

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

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

答案 3 :(得分:0)

可以使抽象方法受到保护。接口方法不能。