Java:将“实现”分解为两个+类

时间:2016-11-13 02:17:40

标签: java extends implements

我有一个我正在使用的Java应用程序的插件架构。

所有例子都显示:

   public class SpecialName implements BaseExtenderClass, ClassB, ClassC {
   //Stuff
   }

其中“SpecialName”是一个名称,您必须为您的类命名,以便将其识别为插件,而BaseExtenderClass,ClassB,ClassC都是在该类中扩展以执行某些操作的不同API功能。每个人都有自己必须实施的方法。

我想知道的是,如果在Java中有一种方法我可以将ClassB和ClassC放在具有SpecialName的BaseExtenderClass的单​​独文件中,并且仍然使其表现为所有密集目的,就像我上面列出的原始代码一样。 / p>

代码会更整洁,更有条理我可以这样做,因为我正在编写的插件实际上会扩展6-8个可用的api接口。

如果没有,我可以拥有一个庞大的文件...它只是感觉不是正确的做事方式。

2 个答案:

答案 0 :(得分:1)

您是否尝试拆分接口定义或其实现代码?

我假设您说您不想将所有3个接口的实现代码放在同一个类中,而是需要分成2个或更多个文件(类),因为您评论了潜力大小

如果是这种情况(并且我假设你有充分的理由这样做),你应该能够创建一个实现ClassB和ClassC的中间类,然后从那个继承。

像这样......

public class TmpClass implements ClassB, ClassC {
  //put implementation for these 2 interfaces here
}

public class SpecialName extends TmpClass implements BaseExtenderClass {
  //add implementation for BaseExtenderClass interface here
}

答案 1 :(得分:1)

你的例子有点困惑。我认为应该是:

public class SpecialName extends BaseExtenderClass
   implements InterfaceB, InterfaceC {

重点是:

  • 一个班级可以extend(最多!)另一个班级。
  • 一个类可以implement多个接口。
  • 班级不能implement上课。

那么如何处理具有复杂接口层次结构的情况并且您希望避免重复接口方法的实现代码?

您可以做的最好是以下各项的组合:

  • 部分将接口图镜像为基类,并重复无法继承的方法; e.g。

       public class MyClass extends BaseAB 
            implements InterfaceA, InterfaceB {
            // specific methods for MyClass
       }
    
       public class BaseAB extends BaseA 
            implements InterfaceA, InterfaceB {
            // base methods for InterfaceB
       }
    
       public class BaseA implements InterfaceA {
            // base methods for InterfaceA
       }
    
  • 将通用功能实现为组件,并使主类成为包装器; e.g。

       public class MyClass implements InterfaceA, InterfaceB {
           private InterfaceA a = new MyA(...);
           private InterfaceB b = new MyB(...);
    
           public void methodInA(...) {
               a.methodInA(...);
           };
    
           // more adapter methods, as above
    
           // specific methods for MyClass
       }