Cheat single inheritance in Java?我听说有一种方法可以欺骗单一继承并在Java中实现多重继承。有人知道如何实现这个(不使用接口)? 只是出于好奇;—) 当然可以,但这很棘手,你真的应该考虑一下这是否是你想要的方式。其思想是使用基于范围的继承和基于类型的继承。它是一种类型转换,表示为了内部目的,内部类"继承"外部类的方法和字段。这有点像mixin,在mixin中,外部类被混合到内部类中,但并不安全,因为您可以更改外部类的状态并使用其方法。Gilad Bracha(一个主要的Java语言设计者)写了一篇论文来讨论这个问题。因此,假设您想要在一些不相关的类之间共享一些内部使用的方法(例如,对于字符串操作),您可以创建它们的子类作为具有所有所需方法的类的内部类,并且子类可以同时使用来自它们的父类和外部类的方法。 不管怎样,对于复杂的类来说很棘手,并且可以使用静态导入(从Java 5上)获得大部分功能。不过,对于求职面试和酒吧小测验来说,这是个很好的问题;-) "Java>单< /Grace>多继承不受Java的支持,相反,它有接口来实现同样的目的。如果你坚定不移地使用多重继承,它应该在C++中完成。 使用组合而不是继承往往是解决这一问题的方法。这实际上对可测试性也有很大的帮助,所以一般来说这是一个很好的实践。 如果您只希望您的类型像其他几个类型一样"行为",那么您可以根据自己的喜好从任意多的接口继承;显然,您不能从这些接口"借用"实现细节。 我认为,Java不支持多重继承的根本原因与C.*一样,所有对象最终都是从对象派生的,并且对于同一基类有多条路径对于编译器来说是不明确的。不明确==错误,因此编译器不允许这样做。 相反,您可以通过委托模拟多个继承。请参阅本文中的示例。 通过使用java.lang.reflect.proxy实例,您可以稍微欺骗(我也强调了一点)。 这实际上只允许您添加额外的接口,并在运行时将它们的调用委托给另一个实例。 作为一个指导和指导新开发人员的人,如果有人向我展示了这样做的代码,我会感到震惊。反射是一种工具,在跳入之前,你真的需要了解并对Java有很好的理解。我个人只做过一次,这是为了让一些我无法控制的代码实现一些接口,一些我无法控制的其他代码实现(这是一个快速的黑客攻击,所以我不必编写和维护太多的粘合代码)。 您可以通过显式地管理超类集并使用反射来搜索目标方法的所有超类来"模拟"它。我不想在生产中做这个,但它可能是一个有趣的玩具程序。通过利用反射、动态创建类以及通过编程调用编译器,您可能会做很多奇怪的事情。 您需要小心区分接口继承(本质上是提供特定设施的契约继承)和实现继承(实现机制继承)。 Java通过实现机制提供接口继承,并且可以具有多个接口继承。 实现继承是一种扩展机制,您只有一个版本。您真的需要多个实现继承吗?我敢打赌,你不会的,它充满了不愉快的后果,除非你是艾菲尔铁塔的程序员。 使用 通过使用内部类,这也是C++有时更喜欢的:内部类习惯用法。 有人努力把Mixin带进Java。查看此链接:http://www.disi.unige.it/person/lagoriog/jam/ 我更多地考虑这个问题,并且意识到虽然动态代理可以工作(这就是RMI(使用)的方式?)为了工作),如果您真的想要这种功能,那么最好使用AspectJ(eclipse.org/AspectJ)之类的工具来研究面向方面编程(AOP)。 这样,您就可以将几个不同的方面放入一个类中,从而提供伪混合继承,而不需要极其脆弱的继承继承继承。 正如其他人所指出的,想要/需要多重继承通常表明您没有从正确的角度来处理这个问题。首先要记住gof的"优先组合而不是继承"原则! Java不支持多个继承。 您可以让它实现多个接口,有些人认为这是解决问题的一种方法。就我个人而言,我还没有使用多重继承,所以我不能真正理解它的吸引力。 通常情况下,当某人在C或Java中提出多个继承时,这是由于C++中的"他们可以"。我很喜欢"仅仅因为你能做并不意味着你应该做"。由于C和& Java不支持它,为什么要强迫它去做它没有做的事情。这并不是说在某些特殊的情况下,Empoly是一种有效的技术,只是代码通常可以重构为不需要它。 是的,你可以说这是一个技巧,很有趣的是,你不能将多个类继承到一个类,但是可以实现多个接口到一个类,比如
但请记住,您必须重写接口中声明的方法。 |