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


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


7210
2017-11-18 02:43


起源



答案:


你所说的“骨骼类”的要点主要是强制执行某些基本规则来控制你的设计的使用。接口和抽象类本身无法完成这项工作。例如,考虑接口

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

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

现在拿抽象类

  1. Java不支持多重继承,因此无法获得多个类,抽象或其他类的好处
  2. 只有当接口(对我来说)位于多态树的顶部时,才能从基于抽象类的设计中获得多态的全部好处。

结合两者可以为您提供两全其美的优势

  1. 抽象类可以实现接口。实现类可以扩展您的抽象类,以获得已经实现的接口方法的好处。这个链接可以继续进行必要的抽象类,直到具体实现
  2. 实现类可以根据标记类型的需要实现尽可能多的接口。所以你可以拥有尽可能多的人 Serializable 用于标记的类型接口,将由其他接口扩展
  3. 实现抽象类(实现接口)的类可以定义为接口类型,以便在被实例化为抽象类的子类时受益于更好的多态性

考虑这个用例

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

11
2017-11-18 02:46



您能举例说明它如何执行某些基本规则来管理设计的使用。 - peter
@ user1389813,随时更新我的​​答案:) - kolossus
你是什​​么意思接口无法实现任何东西?接口可以扩展其他接口,对吧? - peter
@ user1389813, implements 不是 extends。界面不能 implements 另一个界面(当然),但是,可以 extends,仍然有效地留下了一个壳 - kolossus
所以'骨架'类实际上是一种类,它从接口(多重继承)收集所有方法,并能够提供方法的一些定义,它主要是为继承而设计的,对吗? - peter


答案:


你所说的“骨骼类”的要点主要是强制执行某些基本规则来控制你的设计的使用。接口和抽象类本身无法完成这项工作。例如,考虑接口

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

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

现在拿抽象类

  1. Java不支持多重继承,因此无法获得多个类,抽象或其他类的好处
  2. 只有当接口(对我来说)位于多态树的顶部时,才能从基于抽象类的设计中获得多态的全部好处。

结合两者可以为您提供两全其美的优势

  1. 抽象类可以实现接口。实现类可以扩展您的抽象类,以获得已经实现的接口方法的好处。这个链接可以继续进行必要的抽象类,直到具体实现
  2. 实现类可以根据标记类型的需要实现尽可能多的接口。所以你可以拥有尽可能多的人 Serializable 用于标记的类型接口,将由其他接口扩展
  3. 实现抽象类(实现接口)的类可以定义为接口类型,以便在被实例化为抽象类的子类时受益于更好的多态性

考虑这个用例

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

11
2017-11-18 02:46



您能举例说明它如何执行某些基本规则来管理设计的使用。 - peter
@ user1389813,随时更新我的​​答案:) - kolossus
你是什​​么意思接口无法实现任何东西?接口可以扩展其他接口,对吧? - peter
@ user1389813, implements 不是 extends。界面不能 implements 另一个界面(当然),但是,可以 extends,仍然有效地留下了一个壳 - kolossus
所以'骨架'类实际上是一种类,它从接口(多重继承)收集所有方法,并能够提供方法的一些定义,它主要是为继承而设计的,对吗? - peter