English 中文(简体)
Java中的欺骗单继承?
原标题:
  • 时间:2008-09-16 09:00:27
  •  标签:

我听说有一种方法可以欺骗单继承,并在Java中实现多继承。有人知道如何实现这一点吗(没有使用接口)?

只是出于好奇;-)

最佳回答

Sure you can, but it s tricky and you should really consider if that s the way you want to go.
The idea is to use scope-based inheritance coupled with type-based one. Which is type-talk for saying that for internal purposes, inner classes "inherit" methods and fields of the outer class. It s a bit like mixins, where the outer class is mixed-in to the inner class, but not as safe, as you can change the state of the outer class as well as use its methods.
Gilad Bracha (one of the main java language designers) wrote a paper discussing that. So, suppose you want to share some methods for internal use between some unrelated classes (e.g, for string manipulation), you can create sub classes of them as inner classes of a class that has all the needed methods, and the sub classes could use methods both from their super classes and from the outer class.

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

问题回答

SingleJava不支持多重继承,相反,它有用于相同目的的接口。如果您坚持使用多重继承,那么应该在C++中进行。

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

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

我认为Java不支持多重继承的根本原因与C#相同;所有对象最终都是从Object派生而来的,并且它具有指向同一基类的多个路径,这对编译器来说是不明确的。模棱两可==错误,因此编译器不允许这样做。

相反,您可以通过委托来模拟多重继承。请参阅这篇文章就是一个例子。

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

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

作为一个指导和指导新开发人员的人,如果有人向我展示这样做的代码,我会感到震惊。反射是你真正需要理解并在加入之前对Java有一个很好的理解的工具之一。我个人只做过一次,那就是制作一些我无法控制的代码来实现一些接口——其他一些我无法掌控的代码是我所期望的(这是一个快速的破解,所以我不必编写和维护太多的粘合代码)。

使用接口s。您可以实现任意数量的。您通常可以在复合模式(GoF)以便能够在需要时重用实现代码。

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

Java通过实现机制提供接口继承,并且可以具有多个接口继承。

实现继承是扩展机制,您只得到了它的一个版本。您真的需要多重实现继承吗?我敢打赌你不会,它充满了令人不快的后果,除非你是一个艾菲尔程序员。

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

JAVA不支持多重继承。

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

通常,当有人建议在c#或JAVA中进行多重继承时,这是因为他们可以在c++中进行。我是的粉丝,仅仅因为你可以,并不意味着你应该。作为c#&;JAVA不支持它,为什么要强迫它做一些它没有设计好做的事情呢?这并不是说在某些独特的情况下,它是一种有效的技术,只是代码通常可以重构为不需要它。

我对此有了更多的思考,并意识到虽然动态代理可以工作(RMI(过去是这样工作的?)),但如果你真的想要这种功能,你最好看看使用AspectJ(eclipse.org/AspectJ)之类的东西的面向方面编程(AOP)。

通过这种方式,您可以将多个不同的方面集成到一个类中,从而提供伪混合继承,而不会出现极其脆弱的继承继承体系。

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

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

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

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

public class parents implements first, second{

}

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





相关问题
热门标签