如果两个类扩展不同的类,避免重复代码的最佳方法

use*_*009 12 java android code-duplication

我正在开发一个Android项目,我正面临这种情况.

我有2节课:

class A extends B
{

openDoor(){
//impl
}

closeDoor(){
//impl
}

}

class X extends Y{

openDoor(){
//impl
}

closeDoor(){
//impl
}

}
Run Code Online (Sandbox Code Playgroud)

现在,如果你观察到两个类openDoor()和两个常见的方法closeDoor()

什么是避免重复方法的最佳方法?

我的方法

class ContainingDuplicateMethods{

     openDoor(){
    //impl
    }

    closeDoor(){
    //impl
    }

    }
   }
Run Code Online (Sandbox Code Playgroud)

在类中创建ContainingDuplicateMethods对象并调用方法,我们将其称为策略模式,但这是最佳解决方案吗?为什么,因为在大型项目中我们不能遵循这种方法,人们说它不是很好的做法,在这种情况下,我需要遵循什么方法?

请注意,class A and X已经扩展了其他类,我也不想使用静态因为 - 静态成员在程序执行开始时被加载到内存中,并且将在内存中直到程序终止,比如我的代码连续运行数天或数周继续使用静态引用创建许多对象,因此我们可能会耗尽内存.

Tim*_*m B 16

"赞成组合而非继承"是一件值得记住的事情.

有一个Door开放和关闭的课程.包括a Door作为两者的成员AB.

瞧,工作完成了.

所以A.getDoor().close().B.getDoor().open()等等

如果您需要两个通用的接口AB(所以你可以使用的地方),然后创建

interface HasDoor {
    Door getDoor();
}
Run Code Online (Sandbox Code Playgroud)

现在A,B可以扩展您喜欢和实现的任何类HasDoor.任何需要门的类都可以接受HasDoor(或直接接受Door物体)并打开,关闭等.

没有重复的代码,充分的灵活性.

如果您需要Door调用方法早在AB然后创建Door类的抽象和实现它A,并B作为一个匿名内部类.抽象方法将被调用Door,然后你可以做任何的处理是必要的A,并B当这些方法被调用.

例如,A类变为:

 class A implements HasDoor {
      private Door door = new Door() {
          @override void notifyDoorChanged(boolean closed) {
                // The door is telling us its been opened or closed
          }
      }

      @override
      public Door getDoor() {
           return door;
      }
 }
Run Code Online (Sandbox Code Playgroud)

门在哪里:

 public abstract class Door {
      boolean closed;
      abstract notifyDoorChanged();

      public void close() {
         closed = true;
         notifyDoorChanged(closed);
      }

      // etc
 }
Run Code Online (Sandbox Code Playgroud)

请注意,这与策略模式类似 - 但它并不完全相同.策略模式有一个主对象,然后您插入多个策略(即不同形式的门).这有一个门和多个其他对象使用相同类型的门,但您可以扩展它以使用策略模式并且非常容易地实现多个门实现.


Sca*_*bat 0

是的,创建一个包含公共代码的抽象类。让这个抽象类实现一个包含必要方法的接口。

让其他两个类扩展抽象类。