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

时间:2012-11-18 02:43:10

标签: java interface abstract-class

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

1 个答案:

答案 0 :(得分:13)

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

  1. 您无法指定有关方法的任何实施细节
  2. 在接口级别指定的变量必须是静态的。
  3. 接口无法实现任何内容(类或接口)
  4. 因此,这意味着仅使用接口来指定设计规则仍然允许滥用界面中定义的操作,您将无法指定重要的类级变量或完全利用继承。< / p>

    现在采用抽象类

    1. Java不支持多重继承,因此无法获得多个类,抽象或其他类的好处
    2. 只有当接口(对我来说)位于多态树的顶端时,才能从基于抽象类的设计中获得多态的全部好处
    3. 结合两者为您提供了两全其美的优势

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

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