当前位置: 首页 > 知识库问答 >
问题:

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

田成仁
2023-03-14

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.

}

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

共有3个答案

姬慎之
2023-03-14

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

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

为此,我们必须记住,OO是一种建模“真实世界”的方法:好的设计提供易于理解的模型,坏的设计很难遵循。此外,好的OO设计可以在建模问题可能扩展的方向上扩展。(显然,我不是在谈论<code>扩展</code>关键字。)

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

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

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

叶翰林
2023-03-14

抽象类可能是诀窍,但正如《成长的面向对象软件,由测试指导》一书所建议的那样,它会影响单元测试级别:

不要模仿混凝土等级

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

这里有一个关于这个主题的问题,我之前问过几次,想进一步了解这个问题。

你会告诉我:“但是抽象类不是具体类!”< br >我称之为具体类,每个类集合一些行为以形成一个实体。< br >抽象类可能经常实现属于不同职责的几个方法,因此降低了对象协作者的明确性。

因此,我将“按角色编程”改为“向接口编程”。

彭令秋
2023-03-14

Q.如果您在未链接到接口的抽象类中创建抽象html" target="_blank">方法,您是否仍然遵循编程到接口的原则?

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

您可以随时添加< code > Interface 2 extends Interface 来反映此方法的额外功能。你提到了这个选项——如果抽象类不是“一个接口”,它可能是有意义的。

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

    < li> 用户界面-对用户详细信息的只读访问 < li> 用户维护扩展用户界面-还允许更新用户详细信息。

看来你情况可能符合这个定义。

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

 类似资料:
  • 我正在重构我的代码,所以我需要做出关于接口或抽象类的决定。我有基类Player和继承基类的类,称为VideoPlayer、MusicPlayer等。基类有抽象方法,没有实现(Play)。那么,最好的方法是什么?将Play放在接口中或将其留在抽象类中。在MusicPlayer中播放与在VideoPlayer中的播放器不同。我是用C#实现的。

  • 当我宣布“抽象公共无效显示();”在抽象类测试中,这是创建一个全新的show()方法,还是只引用Inter接口中声明的show()方法?请澄清。

  • 问题内容: 我发现情况: 问题答案: 您同时满足这两个条件;即。一种实现是同时满足抽象类要求和接口要求。 注意,除非在另一个继承链中使用,否则不需要它。另外,将其移至抽象类定义可能很有意义。

  • 我已经研究了接口、抽象类和继承的用法。我知道每一种都有其用途,但我还是有点困惑。 我知道一般一个类只能扩展另一个类,虽然有些可能支持多个继承,但它可以实现多个接口(这可能是使用接口的主要原因)。然而,如果我是正确的,这个类也可以被另一个类扩展。我还看到抽象类可能比接口更快,并且可以有非静态的最终变量。 所以,我仍然不确定什么时候使用哪个更好。也许通过举例可以更好地理解这一点。我不反对使用任何东西,

  • 我对EasyMock(3.1)类的模拟有些困难。这应该适用于模拟部分类实现,我认为,这对于单元测试抽象基类,同时模拟缺少的方法是非常理想的。这是一个模式-一个立即识别的经典... 现在的测试是: EasyMock似乎不喜欢这样。它抛出: 有什么想法吗?我发现了一个相关的问题,但它并不是真正公正的标题。

  • 我想给出一个完整的答案: “为什么/何时使用抽象类而不是接口。” 并寻求对以下方面的验证/建议。 “一个原因是:接口方法都是公共的,字段成员都是常量(final和public)。您可能需要限制方法的访问权限和/或使它们在非常量状态下操作。 另一个是:子代类可以通过super调用抽象类方法,而它不能对默认接口方法调用抽象类方法。此外,接口没有可由后代调用的构造函数。 其余的原因与上面的pre-Jav