【问题标题】:How to create a class that "extends" two existing concrete classes如何创建一个“扩展”两个现有具体类的类
【发布时间】:2011-08-29 13:20:38
【问题描述】:

我很清楚这可以在接口的帮助下完成,我已经做过很多次了。但这一次我的情况却大不相同。我有class Aclass B,我需要创建另一个class C,它扩展了A和B,因为C应该具有两者的功能,并且还要注意A和B不是相互关联的,所以即使我不能说A可以扩展@ 987654326@.

我很困惑我现在应该做什么。我知道我们不能改变java......但至少有一些方法是可能的。即使是最近的也可以...请帮帮我。

添加更多细节:- Class B 是一个标准 API,而 class A 是一个通用异常类,需要被所有异常类继承。

相关问题:

【问题讨论】:

  • 如果我们知道您是否可以控制 class Aclass B,这将有所帮助。
  • @riduidel 这不可能重复...请不要关闭这个问题。
  • @eric 我可能对 A 有一些控制...实际上 A 是一个异常类,所有异常类都必须继承它。另请注意,B 是标准 API,因此无法对其进行控制。
  • 您不使用多重继承从异常和标准 API 类继承,抱歉,这完全是错误的,根本没有意义。

标签: java oop multiple-inheritance


【解决方案1】:

这通常使用object composition 解决。

《Effective Java》第 16 条中也提倡这一点:优先组合优于继承

Java 将一个类的 is a-relation 限制为两个(不相关的)类。它确实限制一个类具有两个不相关类的功能


class A {
    void doAStuff() {
        System.out.println("A-method");
    }
}

class B {
    void doBStuff() {
        System.out.println("B-method");
    }
}

// Wraps an A and a B object.
class C {
    A aObj;
    B bObj;

    void doAStuff() {
        aObj.doAStuff();
    }

    void doBStuff() {
        bObj.doBStuff();
    }
}

(或者,您可以使用 class C extends A 并仅为 B 创建包装器方法,但请记住,说 C 是 A 应该是有意义的。)


我有一个需要遵循的设计模式,为此它必须扩展

正如您可能知道的那样,这是完全不可能的。但是,您可以为 AB 创建代理类,将功能委托给 C-instance。例如通过将这两个方法添加到上面的C-class 中:

class C {

    // ...

    public A asAObject() {
        return new A() {
            @Override
            void doAStuff() {
                C.this.doAStuff();
            }
        };
    }

    public B asBObject() {
        return new B() {
            @Override
            void doBStuff() {
                C.this.doBStuff();
            }
        };
    }
}

【讨论】:

  • 另外,您可以提取A和B的接口并让C实现它们 - 如果您将用于A和B的代码更改为使用接口,您可以将C粘贴在那里; )
  • 是的......如果他可以控制相关的类,那是一个非常好的方法。
  • 优先组合优于继承我的最爱之一 :-)
【解决方案2】:

http://en.wikipedia.org/wiki/Adapter_pattern

适配器模式解决了您的问题。我回去检查了 wiki 文档,以确保 :)

【讨论】:

  • @一个神话thnx很多链接。
【解决方案3】:

在 Java 中,不能扩展两个类,从而从这两个类继承功能。您最简单的替代方法是“包装”两个类中的至少一个。因此,您可以在 C 中拥有 B 的实例,并在 C 上声明 B 的每个方法,然后传递它们,而不是扩展 B。 C 不会“成为”B,但听起来您只想继承功能。如果 A 也是如此,那么,你应该对 A 和 B 都使用这种模式,而不是扩展。

【讨论】:

  • 感谢您的回复,但我不想要的只是功能,我有一个需要遵循的设计模式,因此它必须扩展。
  • 在我的回答中对此发表了评论。
  • 你不能“拥有需要遵循的设计模式”。这是没有意义的!您应该尝试告诉我们您想要(想要完成)什么,然后我们可以帮助您解决问题。
【解决方案4】:

利用构图。 C 类将包含 A 类和 B 类的实例。

【讨论】:

    【解决方案5】:

    您可以尝试创建class C,它将包含class A 的一个实例和class B 之一及其方法(创建具有相同名称的方法,只调用来自AB 的方法),它是称为组合 - 与继承相反的另一种方法。当然,如果您不需要 instanceof 来处理 C 类,那当然是这样。

    【讨论】:

      【解决方案6】:

      一个常见的 oop 原则是“选择组合而不是继承”,因为您不能扩展 2 个类正在尝试做。

      【讨论】:

        【解决方案7】:

        也许您可以创建一个新的 D 类,并让 A 类和 B 类都从 D 继承?

        【讨论】:

          【解决方案8】:

          改变你的思维方式。考虑接口。这意味着A类实际上是接口A'的实现,而B类是接口B'的实现。你实际上想要一个实现接口 A' 和 B' 的类 C。 C 类不需要扩展任何东西或使用任何特定的模式或任何东西。它可以扩展 A 并将一些方法委托给 B,或者它可以扩展 B 并将一些方法委托给 A。或者它可以将所有方法委托给 A 和 B - 实现是您的决定。

          【讨论】:

          • 不适用于异常......他想要一个异常的基础,但我猜他实际上并不真正知道他想要什么。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-25
          • 1970-01-01
          • 2015-04-12
          • 2013-06-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多