抽象类和接口在一起?

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

感觉是正确的,但是子类之间有一点重复 - 即3种方法。

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

我的问题是,在以下情况下同时使用抽象类和接口会有什么缺点:

  1. 用于实现接口的抽象类和用于扩展抽象类的子类
  2. 用于扩展抽象类和实现接口的子类

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


答案 1

同时使用这两者是完全正常的。例如,考虑JDK中的抽象列表(实现)和抽象映射(实现)。ListMap

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

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 */
}

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


答案 2

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


推荐