【问题标题】:Java how a class A can have multiple potential extendsJava 类 A 如何具有多个潜在扩展
【发布时间】:2017-11-15 17:42:05
【问题描述】:

您好,我对继承有疑问。

让我们拥有这三个:

           A
         /   \
        /     \
       B       C
       \       /
        \     /
           ?
           |
           D


    abstract class A {
        public abstract void print();
        public abstract int getInt();
    }

    abstract class B extends A {
        @Override
        public int getInt() {
          return 5;
        }
    }

    abstract class C extends A {
        @Override
        public int getInt() {
           return 1;
        }
    }


    class D extends B || C {
        @Override
        public void print() {
         console.log(this.getInt());
       }
    }

我想添加一个可以继承 B 或 C 的 D 类。

当我创建一个新的 D() 时,我可以选择父级。我不想使用多重继承(java也不能这样做),我想使用一种方法通过更改其父类的实现来在类上添加特定的comportment。

事实上 D 应该从 A 继承,但我可以在运行时选择 B 或 C 的特殊实现。我们可以认为 B 和 C 不允许实现除 A 之外的其他方法。

这可能吗?

【问题讨论】:

  • “在运行时选择的实现”对我来说听起来像是策略模式。
  • 或更一般地说,“composition over inheritance”。
  • 为什么不直接使用策略或模板方法模式以及工厂模式?
  • 同意标记空间。工厂方法模式可能是一种选择,但前提是 B 和 C 是具体类。战略听起来像是一个明智的解决方案。
  • @luk2302 我没有成功实施你的例子

标签: java inheritance design-patterns


【解决方案1】:

C++ 具有多重继承,在设计 Java 时,引入了 接口 来替代多重继承,以提供代码替代方案,并防止多重继承的歧义和其他问题。

可以使用 delegation 代替,然后解决正确的多次调用的策略是使用类。

class D extends A {
    B b;
    C c;

    @Override
    public int getInt() {
      return b.getInt() + c.getInt();
    }
    ...
}

class D extends A {
    A delegatee;

    public final void iAmReally(A a) {
        delegatee = a;
    }

    @Override
    public int getInt() {
      return delegatee.getInt();
    }
    ...
}

【讨论】:

  • 根据之前的回复,看来只能这样了。但是策略模式迫使我重复 A 的代码,所以我想我会尝试找到另一个技巧。那么,实际上 Java 不允许在运行时以任何方式更改类的父级?
  • 有针对接口的代理类,但主要是单继承
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多