【问题标题】:Same implementation in different subclasses不同子类中的相同实现
【发布时间】:2012-05-23 07:02:00
【问题描述】:

假设我有以下场景:

    abstract class A {
        abstract method1();
        abstract method2();
    }

    class B extends A {
        method1() {
            // implementation 1
        }
        method2() {
            // implementation 3
        }
    }

    class C extends A {
        method1() {
            // implementation 1
        }
        method2() {
            // implementation 4
        }
    }

    class D extends A {
        method1() {
            // implementation 2
        }
        method2() {
            // implementation 4
        }
    }

底线:同一个类的几个子类,对不同的方法使用不同的方法实现。

问题是我在不同的子类中有相同的实现。我的问题是如何处理这些常见的实现?
这样做的合乎逻辑的方法是创建另一个抽象级别,但这只有在我有一个具有通用实现的方法时才有效(因为 Java 没有多重继承)。我也可以把最常用的实现放在超类中,只在其他类中以不同的方式实现。但是,我不会这样做,因为随着时间的推移,最常见的实现可能会随着其他类的添加而改变,此外,我想在超类中保持方法抽象。

是否有某种模式可以以“优雅的方式”解决我的问题?

【问题讨论】:

  • 没有将一堆不相关的方法放在一起的模式。模式将取决于这些方法如何相互关联(模式的上下文部分)
  • 如果方法不相关,但仍希望从单个类中保持对它们的引用,请使用:single class, no inheritance and command pattern (one command object per method),您可以通过构造函数注入命令对象
  • 好吧,它们并非无关。它们为客户端提供了一些必需的功能,但只是做不同的事情。
  • 是什么将它们绑定在一个对象中?

标签: java


【解决方案1】:

您遇到了经典的 OOP 问题,继承层次结构变得笨拙:-)

我建议的解决方案:

  • 优先组合而不是继承 - 将实现分解为单独的对象,这些对象可以“插入”以提供所需的行为。基类中的方法只是通过其定义的接口调用实现插件。这基本上是Strategy Pattern。这是一种非常可靠的方法,但当您有很多不同的策略类型时,有时可能会出现大量过度设计/样板文件。
  • 采用基于原型的模型 - 使用 prototype-based 对象而不是传统的 OOP。这解决了所有问题——您摆脱了继承层次结构的固有限制,只需将您想要的实现复制到运行时需要它的任何对象。这是最激进的选择,但可以带来一些巨大的好处。
  • 将实现分解为静态函数 - 这样您可以共享实现 - 这有点麻烦,因为您仍然需要进行所有覆盖,但它们只是将调用委托给正确实现的单行代码.这通常是干扰最小的选项。

【讨论】:

  • 感谢您的分析。主要是因为提到了策略而被接受。
【解决方案2】:

我会推荐作曲。考虑以下几点:

interface I1 {
     method1();
}

abstract class A implements I1{
    abstract method1();
    abstract method2();
}

class CommonOperations implements I1 {
    method1() {
        // implementation 1
    }
}

class B extends A {
    CommonOperations common;

    method1() {
        common.method1();
    }
    method2() {
        // implementation 3
    }
}

class C extends A {
    CommonOperations common;

    method1() {
        common.method1();
    }
    method2() {
        // implementation 4
    }
}

class D extends A {
    method1() {
        // implementation 2
    }
    method2() {
        // implementation 4
    }
}

【讨论】:

    猜你喜欢
    • 2015-07-04
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 2020-04-30
    • 2014-10-25
    相关资源
    最近更新 更多