8

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

只是出于好奇;-)

4

13 回答 13

20

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

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

于 2008-09-16T10:37:58.537 回答
5

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

于 2008-11-29T06:28:08.180 回答
4

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

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

于 2008-09-16T09:04:43.380 回答
3

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

相反,您可以通过委托模拟多重继承。有关示例,请参见本文。

于 2008-09-16T09:05:32.237 回答
2

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

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

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

于 2008-09-16T09:12:18.773 回答
1

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

于 2008-09-16T09:05:18.230 回答
1

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

Java通过implements机制提供接口继承,可以有多个接口继承。

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

于 2008-09-16T09:13:25.043 回答
1

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

于 2008-09-16T09:14:43.103 回答
0

JAVA 不支持多重继承。

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

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

于 2008-09-16T09:02:28.830 回答
0

我在考虑这个问题并意识到虽然动态代理可以工作(这就是 RMI(使用?)的工作方式),但如果你真的想要这种功能,你最好看看面向方面编程 (AOP) 使用类似于 AspectJ (eclipse.org/aspectj)。

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

正如其他人所指出的那样,想要/需要多重继承通常表明您没有从正确的角度解决问题。记住“优先组合胜过继承”的 GoF 原则!

于 2008-09-16T09:38:53.030 回答
0

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

于 2008-09-16T10:21:54.630 回答
0

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

于 2009-05-12T20:29:35.547 回答
-1

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

public class parents implements first, second{

}

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

于 2017-10-15T09:53:56.190 回答