代码之家  ›  专栏  ›  技术社区  ›  Community wiki

Java中的欺骗单继承?

  •  8
  • Community wiki  · 技术社区  · 3 年前

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

    只是出于好奇;-)

    13 回复  |  直到 14 年前
        1
  •  20
  •   Tom Zych    10 年前

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

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

        2
  •  4
  •   Calum    18 年前

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

        3
  •  4
  •   community wiki 2 revs, 2 users 67% Warrior    17 年前

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

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

        4
  •  3
  •   Steve Morgan    18 年前

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

    相反,您可以通过委派来模拟多重继承。看见 this article 例如。

        5
  •  2
  •   Aidos    18 年前

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

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

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

        6
  •  1
  •   Hank Gay    18 年前

    使用 interface s.你可以随心所欲地实施。您通常可以在 Composite Pattern (GoF) 如果需要的话,能够重用实现代码。

        7
  •  1
  •   Tim Hoverd    18 年前

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

    Java通过 机具 机制和你 可以 具有多接口继承。

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

        8
  •  1
  •   Bert F    18 年前

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

        9
  •  0
  •   TK.    18 年前

    JAVA不支持多重继承。

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

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

        10
  •  0
  •   Aidos    18 年前

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

    通过这种方式,您可以在一个类中获得几个不同的方面,从而提供伪mixin继承,而不需要极其脆弱的继承继承体系。

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

        11
  •  0
  •   Elnur    18 年前

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

        12
  •  0
  •   community wiki Özgür    17 年前

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

        13
  •  -1
  •   community wiki 2 revs, 2 users 67% Abdur Rehman Khalid    9 年前

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

    public class parents implements first, second{
    
    }
    

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