在Java中欺骗单一inheritance?

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

只是出于好奇;-)

当然可以,但这很棘手,你应该考虑这是否是你想要的方式。
我们的想法是使用基于范围的inheritance与基于类型的inheritance相结合。 对于内部目的而言,内部类“inheritance”外部类的方法和字段,这就是类型说话。 它有点像mixins,其中外部类混合到内部类中,但不安全,因为您可以更改外部类的状态以及使用其方法。
Gilad Bracha(主要的Java语言设计师之一)写了一篇论文来讨论这个问题。 因此,假设您想要在一些不相关的类之间共享一些内部使用的方法(例如,对于字符串操作),您可以创建它们的子类作为具有所有所需方法的类的内部类,并且子类可以使用来自超级类和外部类的方法。

无论如何,对于复杂的类来说这很棘手,你可以使用静态导入(从java 5开始)获得大部分function。 但求职面试和酒吧测验的好问题;-)

使用组合而不是inheritance往往是解决这个问题的方法。 这实际上也有很大的可测试性,所以一般来说这是很好的做法。

如果你只是希望你的类型像其他几种类型一样“行为”,你可以inheritance任意数量的接口,但是; 显然,你不能从这些“借用”实施细节。

Java不支持单一多重inheritance,而是具有用于相同目的的接口。 如果您坚持使用多重inheritance,则应在C ++中完成。

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

相反,您可以通过委派模拟多重inheritance。 有关示例,请参阅此文章 。

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

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

作为指导和指导新开发人员的人,如果有人向我展示了执行此操作的代码,我会感到震惊。 reflection是你真正需要理解的工具之一,并且在进入之前对Java有很好的理解。我个人曾经只做过一次这样的工作,而且是制作了一些我无法控制的代码实现了一些接口。我无法控制的其他代码是期待的(这是一个快速的黑客,所以我不必编写和维护太多的胶水代码)。

使用interface 。 您可以根据需要实施任意数量的实施。 您通常可以在Composite Pattern(GoF)上使用某些变体,以便能够重用实现代码(如果需要)。

您需要小心区分接口inheritance(本质上是为了提供特定function而inheritance合同)和实现inheritance(实现机制的inheritance)。

Java通过implements机制提供接口inheritance,您可以拥有多个接口inheritance。

实现inheritance是扩展机制,你只有一个版本。 你真的需要多个实现inheritance吗? 我打赌你没有,它充满了令人不快的后果,除非你是一个埃菲尔程序员。

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

JAVA不支持多个Inheritence。

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

通常当有人在c#或JAVA中建议多重inheritance时,由于“他们可以”在c ++中这一事实。 我是“只是因为你不能意味着你应该”的粉丝。 由于c#和JAVA不支持它,为什么要尝试并强制它做一些它不打算做的事情。 这并不是说有一些独特的情况,它是一种有效的技术,只需通过重构代码就可以不需要代码。

我正在考虑更多这一点,并意识到虽然动态代理将起作用(这是RMI(使用?)如何工作),如果你真的想要这种function,你最好不要使用面向方面编程(AOP)类似于AspectJ(eclipse.org/aspectj)。

通过这种方式,您可以将几个不同的方面放入一个类中,从而为您提供伪mixininheritance,而不会有非常脆弱的inheritance层次结构。

正如其他人所指出的那样,想要/需要多重inheritance通常表明你没有从正确的角度来解决问题。 首先要记住“首选组合而不是inheritance”的GoF原则!

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

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

是的,你可以说这是一个技巧,非常有趣的是你不能将多个类inheritance到单个类,但可以实现多个类到类的接口

 public class parents implements first, second{ } 

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