Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当不允许多重继承时,如何避免代码重复?_Java_Inheritance_Design Patterns_Composition - Fatal编程技术网

Java 当不允许多重继承时,如何避免代码重复?

Java 当不允许多重继承时,如何避免代码重复?,java,inheritance,design-patterns,composition,Java,Inheritance,Design Patterns,Composition,我有一个类BaseClass和一个类Subclass,它派生自BaseClass,并重写了它的一些方法 public class BaseClass{} public class SubClass extends BaseClass{ //override some methods } 还有另一个类SimpleBaseClass,它派生自BaseClass,并重写了BaseClass的一些其他方法,因为它与子类具有不同的功能 public class SimpleBaseClass ex

我有一个类
BaseClass
和一个类
Subclass
,它派生自
BaseClass
,并重写了它的一些方法

public class BaseClass{}

public class SubClass extends BaseClass{

//override some methods
}
还有另一个类
SimpleBaseClass
,它派生自
BaseClass
,并重写了
BaseClass
的一些其他方法,因为它与
子类
具有不同的功能

 public class SimpleBaseClass extends BaseClass{

    //override some other methods
    }
在某些情况下,我想将
子类
的功能和特性授予
SimpleBaseClass
。最好的做法是什么?在这种情况下有没有一种模式可以应用?简单地说,虽然可以创建一个新的
SubSimpleBaseClass
,它派生自
子类
,但复制
simplebasclass
的代码,这样就具有了这两个类的功能:
子类
simplebasclass

 public class SubSimpleBaseClass extends SubClass{

        //do what SimpleBaseClass does
        }

但通过这种方式,代码将在
SubSimpleBaseClass
中重新编写。最好的避免方法是什么?也许是
组合
?在这种情况下,
Decorator模式是否是合适的解决方案?

不要使用类层次结构来重用功能。而是使用一个委托模型,将
子类
和假设的
子类
所需的功能重构到另一个类中。一个简单的例子:

interface Handler {
  void foo();
}

public class BaseClass {

  private final Handler handler; // constructor omitted

  public void bar() {
    handler.foo();
  }
}
这允许您实现一种轻形式的“多重继承”,在这种继承中,您仍然可以通过多个类对
基类
进行子类化,您仍然可以实现多个类之间的
的通用行为。这是一种继承,通常是


如果由于某种原因这是不可能的(您的示例不够详细),那么应该重构代码以使用实用方法。永远不要复制和粘贴您的代码。这重复了维护成本。

不要使用类层次结构来重用功能。而是使用一个委托模型,将
子类
和假设的
子类
所需的功能重构到另一个类中。一个简单的例子:

interface Handler {
  void foo();
}

public class BaseClass {

  private final Handler handler; // constructor omitted

  public void bar() {
    handler.foo();
  }
}
这允许您实现一种轻形式的“多重继承”,在这种继承中,您仍然可以通过多个类对
基类
进行子类化,您仍然可以实现多个类之间的
的通用行为。这是一种继承,通常是


如果由于某种原因这是不可能的(您的示例不够详细),那么应该重构代码以使用实用方法。永远不要复制和粘贴您的代码。这会增加维护成本。

是的,使用依赖注入组合可能会有所帮助?我认为您需要重新组织类层次结构。如果您需要在实现时做出一个不美观的架构/实现决策,那么您需要重新考虑您的架构。例如,创建额外的继承步骤和其他相互扩展的抽象类。不谈模式,如果
SimpleBaseClass
SubClass
之间存在共性,您可以为它们创建一个从
基类
派生的共同祖先,并让其他祖先从中派生。重构代码和重构模块的方法有很多。设计模式有助于找到要做的事情。复合模式、装饰模式、偏好组合而非继承思想等等,对于设计软件来说是非常有价值的工具。但是:重构的具体内容取决于您试图实现的功能。或者更好:通过你试图解决的问题。技术问题永远不应该成为重构的动机。@Davio:问题是SimpleBaseClass和SubClass没有共同实现的功能,它们覆盖了父类的不同方法。此外,最终目的是创建一个派生类,该类结合了它们的功能(无需重复代码)。是的,使用依赖项注入进行组合可能会有所帮助?我认为您需要重新组织类层次结构。如果您需要在实现时做出一个不美观的架构/实现决策,那么您需要重新考虑您的架构。例如,创建额外的继承步骤和其他相互扩展的抽象类。不谈模式,如果
SimpleBaseClass
SubClass
之间存在共性,您可以为它们创建一个从
基类
派生的共同祖先,并让其他祖先从中派生。重构代码和重构模块的方法有很多。设计模式有助于找到要做的事情。复合模式、装饰模式、偏好组合而非继承思想等等,对于设计软件来说是非常有价值的工具。但是:重构的具体内容取决于您试图实现的功能。或者更好:通过你试图解决的问题。技术问题永远不应该成为重构的动机。@Davio:问题是SimpleBaseClass和SubClass没有共同实现的功能,它们覆盖了父类的不同方法。此外,最终目的是创建一个结合了它们的功能的派生类(无需重复代码)。我喜欢委托模型,并且我认为继承太多地用于分解代码。我最终实现了它,正如您在回答中建议的那样。每个功能都移动到它的类中,所有类都实现相同的接口。基类持有该接口的引用,可以通过setter交换这些类。事实上,它结束于策略模式。我喜欢委托模型,我认为继承太多地用于分解代码。我最终实现了它,正如您在回答中建议的那样。每个功能都移动到它的类中,所有类都实现