Java:将 "implement" 分成两个 + 类

Java: Break-up "implement" into two+ classes

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

所有例子显示:

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

其中 "SpecialName" 是您必须命名的名称 class 以便它被识别为插件,BaseExtenderClass、ClassB、ClassC 都是不同的 API 功能在那个 class 中扩展以执行某些操作。每个都有自己必须实现的方法。

我想知道的是 Java 中是否有一种方法可以将 ClassB 和 ClassC 放在与具有 SpecialName 的 BaseExtenderClass 不同的文件中,并且仍然让它在所有密集目的下都像原始文件一样运行我在上面列出的代码。

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

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

您是否试图拆分接口定义或它们的实现代码?

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

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

像这样...

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
}

你的例子有点混乱。我觉得真的应该是:

public class SpecialName extends BaseExtenderClass
   implements InterfaceB, InterfaceC {

重点是:

  • 一个 class 可以 extend (最多!)另一个 class.
  • 一个class可以implement多个接口。
  • 一个class不能implement一个class.

那么当你有一个复杂的接口层次结构并且你想避免重复接口方法的实现代码时,你如何处理?

您最好结合以下各项:

  • 部分将接口图镜像为基础class,方法重复,其中继承是不可能的;例如

       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
       }
    
  • 将通用功能作为组件实现,并使您的主要 class 成为包装器;例如

       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
       }