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交换这些类。事实上,它结束于策略模式。我喜欢委托模型,我认为继承太多地用于分解代码。我最终实现了它,正如您在回答中建议的那样。每个功能都移动到它的类中,所有类都实现