繁体   English   中英

抽象类和接口在一起?

[英]Abstract class and interface together?

我有一段代码,其中一些类正在实现一个接口。

这感觉是正确的,但是在儿童班中有一点重复 - 即3种方法。

所以这是尖叫着使用抽象类。

我的问题是,在以下情况下使用抽象类和接口是否有任何缺点:

  1. 抽象类实现接口和子类来扩展抽象类
  2. 子类扩展抽象类并实现接口

要么

抽象类和接口是否应该像这样一起使用?

将这两者结合使用是完全正常的。 考虑例如JDK中的AbstractList (实现List )和AbstractMap (实现Map )。

我的下意识反应是让抽象类实现接口,然后从中派生具体类:

abstract class Base implements TheInterface {
    /* ...shared methods... */
}

class Concrete1 extends Base { }

class Concrete1 extends Base { }

但是你提出另一种可能性的问题让我思考,而且我不能看到很多反对这样做的论点:

abstract class Base {
    /* ...shared methods... */
}

class Concrete1 extends Base implements TheInterface { }

class Concrete1 extends Base implements TheInterface { }

此外,我可以看到一个参数这种方式,具体地,它消除了抽象类和接口之间的耦合。 如果您有其他类的功能性需求Base规定,但并不需要实现该接口,您可以灵活地做到这一点。

还有第三种选择:组合。 根本没有抽象类,而是实现接口的多个具体类在其实现中使用公共帮助器类:

class Helper {
    /* ...shared methods... */
}

class Concrete1 implements TheInterface {
    /* ...uses instance of Helper */
}

class Concrete1 implements TheInterface {
    /* ...uses instance of Helper */
}

这具有相同的灵活性,另一种形式。

我不认为有这样的经验法则。 在设计时尝试并遵循SOLID原则来确定您所做的事情是好还是坏。 你可以在这里找到这些原则。 在这种特殊情况下,我认为你应该确保你遵守“开放 - 关闭原则”。

我个人更喜欢抽象类是其他类的背景的声明,所以如果其他三个类有共同点,那么它们的共同祖先,即仅为这三个其他类创建的抽象类,也应该提供来自接口的代码。 这将使抽象类“完整”(以其方式)提供三个类共享的所有这些属性和方法。

但是,如果所有这些都实现相同的接口,它最终没有区别。 在我看来,使抽象类给出一切常见的东西是一种更清晰的方式。 然后通过仅查看不同的类来比较类更容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM