我听说有一种方法可以欺骗单继承并在Java中实现多重继承。有谁知道如何实现这个(不使用接口)?

只是出于好奇;-)

有帮助吗?

解决方案

当然可以,但这很棘手,您应该认真考虑这是否是您想要的方式。
这个想法是使用基于范围的继承和基于类型的继承。这是类型对话,表示出于内部目的,内部类“继承”外部类的方法和字段。它有点像 mixin,外部类混合到内部类中,但不那么安全,因为您可以更改外部类的状态并使用其方法。
Gilad Bracha(主要的 java 语言设计者之一)写了一个 讨论那个。因此,假设您想在一些不相关的类之间共享一些内部使用的方法(例如,用于字符串操作),您可以创建它们的子类作为具有所有所需方法的类的内部类,并且子类可以使用来自其超类和外部类的方法。

无论如何,对于复杂的类来说这很棘手,并且您可以使用静态导入(从 java 5 开始)获得大部分功能。不过,对于工作面试和酒吧测验来说,这是一个很好的问题;-)

其他提示

单身的Java 不支持多重继承,但它有接口来实现相同的目的。如果您坚持使用多重继承,则应使用 C++ 来完成。

使用组合而不是继承往往是解决这个问题的方法。这实际上对可测试性也有很大帮助,所以总的来说这是一个很好的实践。

如果您只是希望您的类型像其他几种类型一样“表现”,那么您可以从任意多个接口继承;显然,你不能从中“借用”实现细节。

我认为Java不支持多重继承的根本原因和C#是一样的;所有对象最终都是从 Object 派生的,并且它具有指向同一基类的多个路径对于编译器来说是不明确的。不明确==不好,所以编译器不允许。

相反,您可以通过委托来模拟多重继承。看 本文 举个例子。

您可以通过使用 java.lang.reflect.Proxy 实例来稍微欺骗一下(我强调一点)。

这实际上只是允许您添加额外的接口并在运行时将它们的调用委托给另一个实例。

作为指导和辅导新开发人员的人,如果有人向我展示执行此操作的代码,我会感到震惊。反射是您在投入使用之前真正需要了解并充分了解 Java 的工具之一。我个人只做过一次,它是为了制作一些我无法控制的代码来实现一些接口,一些我无法控制的其他代码是我所期望的(这是一个快速破解,所以我不必编写并维护过多的粘合代码)。

使用 interfaces。您可以实施任意数量的实施。您通常可以使用一些变体 复合模式 (GoF) 如果需要的话,能够重用实现代码。

您需要小心区分接口继承(本质上是提供特定功能的契约的继承)和实现继承(实现机制的继承)。

Java通过以下方式提供接口继承 实施 机制和你 具有多个接口继承。

实现继承是 延伸 机制,而你只有一个版本。你 真的 需要多个实现继承?我敢打赌你不会,它充满了令人不快的后果,除非你是一名 Eiffel 程序员。

您可以通过显式管理超类集并使用反射来搜索目标方法的所有超类来“模拟”它。我不想在生产中这样做,但这可能是一个有趣的玩具程序。通过利用反射、动态创建类以及以编程方式调用编译器,您可能可以做很多奇怪的事情。

JAVA不支持多重继承。

您可以让它实现多个接口,有些人认为这是解决问题的方法。就我个人而言,我还没有使用过多重继承,所以我无法真正理解它的吸引力。

通常,当有人建议在 C# 或 JAVA 中使用多重继承时,这是因为在 C++ 中“他们可以”。我支持“仅仅因为你可以,并不意味着你应该”。由于 C# 和 JAVA 不支持它,为什么要尝试强迫它做一些它不打算做的事情。这并不是说在某些特殊情况下它是一种有效的技术,只是代码通常可以重构为不需要它。

我对此进行了更多思考,并意识到虽然动态代理可以工作(这就是 RMI(使用?)的工作方式),但如果您确实想要这种功能,那么最好使用面向方面编程(AOP)类似于 AspectJ (eclipse.org/aspectj)。

通过这种方式,您可以将几个不同的方面放入一个类中,从而为您提供伪混合继承,而无需脆弱的继承层次结构。

正如其他人所指出的,想要/需要多重继承通常表明您没有从正确的角度处理问题。首先请记住 GoF 的“优先组合而非继承”原则!

有人努力将 mixin 引入 Java。查看此链接: http://www.disi.unige.it/person/LagorioG/jam/

通过使用内部类,这也是 C++ 有时更喜欢的: 内部类习语.

是的,你可以说这是一个技巧,而且非常有趣,你不能将多个类继承到单个类,但可以为一个类实现多个接口,例如

public class parents implements first, second{

}

但请记住,您必须重写接口中声明的方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top