java - 不同子类中的相同实现

标签 java

假设我有以下场景:

    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 没有多重继承)。我还可以将最常用的实现放在父类(super class)中,只在其他类中以不同方式实现。但是,我不会那样做,因为随着时间的推移,最常见的实现可能会随着其他类的添加而改变,此外,我想在父类(super class)中保留抽象方法。

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

最佳答案

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

我建议的解决方案:

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

关于java - 不同子类中的相同实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10714984/

相关文章:

Java布局管理器垂直居中

java - 如何在 Java Button (GUI) 中调用外部方法

java - 如何使用 Eclipse 在 Android 中实现/链接 Run Keeper API?

java - 使用 SpEL 更新 Spring bean 属性的值

java - 投影后进行组聚合时引用无效

java - 如何在应用程序加载登录页面时验证 LDAP 服务器?

java - 使用 Maven 下载源

java - 在 Android 中使用 Hashmap 存储伪无限游戏世界时内存不足

java - Hibernate 返回 util.Date as long

java - Java 8 中字符串到方法的映射,传递参数