为什么以及何时在java中使用Skeletal实现

2022-09-03 01:58:57

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


答案 1

正如你所说,“骨架类”的意义主要是执行某些基本规则,这些规则将控制你的设计的使用。就其本身而言,接口和抽象类无法完成这项工作。以接口为例

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

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

现在取抽象类

  1. Java不支持多重继承,因此不可能派生多个类(抽象或其他)的好处。
  2. 你不能仅仅从基于抽象类的设计中获得多态性的全部好处,因为接口(对我来说)位于多态性树的顶部。

将两者结合起来,可以让您两全其美

  1. 抽象类可以实现接口。实现类可以扩展抽象类,以派生接口的已实现方法的优点。这种链接可以根据需要持续到尽可能多的抽象类,直到具体的实现
  2. 实现类可以根据需要实现任意数量的接口,以实现标记类型目的。因此,您可以拥有任意数量的用于标记的类型接口,这些接口将由其他接口扩展Serializable
  3. 实现抽象类(实现接口)的类可以定义为接口的一种类型,以便在实例化为抽象类的子类时受益于更好的多态性

考虑此用例

  • 你有一个接口,它有大约6种方法来控制类的使用,然后你有一个标记接口,你只需要用于识别目的,所以你可以使用也许实例的运算符。
  • 现在,在第一个接口中,您只需要强制实施其中3个方法的特定实现,其余3个,您将留给该类的最终用户。
  • 所以接口 A 有 6 个方法定义,接口 B 只是一个类的标记,表示“我是 B 型类”。现在,您将拥有类 A,一个抽象类,实现接口 A 和 B
  • 在抽象类中,您只实现所需的3个方法,然后将其他3个方法的实现细节留给该抽象类的最终使用者

答案 2