17

从 Effective Java Item 18 中它建议我们可以通过提供抽象骨架实现类来组合接口和抽象类。我想知道我们什么时候应该使用骨架实现来模拟多重继承?有什么优点和缺点?有人可以举个例子吗?

4

1 回答 1

19

正如您所说,“骨架类”的重点主要是强制执行某些基本规则,这些规则将管理您的设计的使用。接口和抽象类本身无法完成这项工作。以接口为例

  1. 您不能指定有关您的方法的任何实现细节
  2. 在接口级别指定的变量必须是静态的。
  3. 接口不能实现任何东西(类或接口)

所以这意味着单独使用接口来指定设计规则仍然允许滥用接口中定义的操作,您将无法指定重要的类级别变量或充分利用继承。

现在采取抽象类

  1. Java 不支持多重继承,因此无法获得多个类、抽象类或其他类的好处
  2. 您不能仅从基于抽象类的设计中获得多态性的全部好处,因为接口(对我而言)位于多态性树的顶部

将两者结合起来可以为您带来两全其美的效果

  1. 抽象类可以实现接口。实现类可以扩展您的抽象类以获取接口已实现方法的好处。并且这种链接可以根据需要持续到尽可能多的抽象类,直到具体实现
  2. 实现类可以实现标记类型所需的尽可能多的接口。所以你可以有尽可能多Serializable的类型接口用于标记,这些接口将被其他接口扩展
  3. 实现抽象类(实现接口)的类可以定义为接口的一种类型,以便在实例化为抽象类的子类时从更好的多态性中受益

考虑这个用例

  • 你有一个接口,大约有 6 个方法将控制一个类的使用,然后你有一个标记接口,你只需要用于识别目的,所以你可以使用 instanceOf 运算符。
  • 现在在第一个接口中,您需要强制执行其中 3 个方法的特定实现,其余 3 个,您将留给类的最终用户。
  • 所以接口 A 有 6 个方法定义,接口 B 只是一个类的标记,表示“我是 B 类类”。现在您将拥有类 A,一个抽象类,实现接口 A 和 B
  • 在您的抽象类中,您只实现了所需的 3 个方法,然后将其他 3 个方法的实现细节留给该抽象类的最终消费者
于 2012-11-18T02:46:11.253 回答