当前位置: 首页 > 面试题库 >

有现有类时,接口如何代替对多重继承的需求

祝宾白
2023-03-14
问题内容

首先…对不起,这篇文章。我知道在stackoverflow上有很多帖子正在讨论多重继承。但是我已经知道Java不支持多重继承,并且我知道使用接口应该是另一种选择。但是我不明白,看到了我的困境:

我必须对用Java编写的非常大而复杂的工具进行更改。在此工具中,有一个数据结构,该数据结构由具有链接成员层次结构的许多不同类对象构建。无论如何…

  • 我有一个Tagged具有多个方法的类,并根据对象的类返回一个对象标签。它需要成员和静态变量。
  • 第二类称为XMLElement允许链接对象,最后生成XML文件。我还需要成员变量和静态变量。
  • 最后,我拥有许多几乎所有应该扩展的数据类,其中XMLElement一些Tagged

好的,这是行不通的,因为只能扩展一个类。我经常阅读到Java一切正常,并且不需要多重继承。我相信,但是我看不出接口应该如何取代继承。

  1. 将真正的实现放入所有数据类中是没有意义的,因为每次都相同,但是这对于接口来说是必要的(我认为)。
  2. 我看不到如何将继承类之一更改为接口。我在这里有变量,它们必须恰好在那儿。

我真的不明白,所以请有人可以向我解释如何处理吗?


问题答案:

您可能应该更喜欢继承(和委托)而不是继承:

public interface TaggedInterface {
    void foo();
}

public interface XMLElementInterface {
    void bar();
}

public class Tagged implements TaggedInterface {
    // ...
}

public class XMLElement implements XMLElementInterface {
    // ...
}

public class TaggedXmlElement implements TaggedInterface, XMLElementInterface {
    private TaggedInterface tagged;
    private XMLElementInterface xmlElement;

    public TaggedXmlElement(TaggedInterface tagged, XMLElementInterface xmlElement) {
        this.tagged = tagged;
        this.xmlElement = xmlElement;
    }

    public void foo() {
        this.tagged.foo();
    }

    public void bar() {
        this.xmlElement.bar();
    }

    public static void main(String[] args) {
        TaggedXmlElement t = new TaggedXmlElement(new Tagged(), new XMLElement());
        t.foo();
        t.bar();
    }
}


 类似资料:
  • 问题内容: 我认为多重继承在Java中总是非法的,但是这段代码可以编译: 是否有一个空接口,例如被认为是不好的做法?有没有一种方法可以避免空接口(使用泛型或其他方式)实现相似的目的? 注意:我不是在问如何通过接口模拟多重继承。我意识到我可以执行以下操作: 由于各种原因,我需要同时具有这两种方法的接口。 问题答案: 实现的 多重继承是不允许的。组件可以继承多个接口。 继承多个接口没有问题,因为您只是

  • 问题内容: 我是Java程序员,正在学习使用Go语言编程。到目前为止,我真的很喜欢这种语言。比Java多得多。 但是有一件事我有点困惑。Java具有接口,因为类只能从一个类继承。由于Go允许多重继承,所以接口的意义是什么? 问题答案: 多态性 接口使函数具有“占位符”参数,该参数可以采用不同的结构作为参数。例如,如果结构Man,Woman,Child实现了Human接口,则参数为Human的方法可

  • 在定义一个类时往往会使其继承某个父类或者实现某个接口,在扩展中实现这个功能非常方便。下面我先给出PHP语言中的代码。 <?php interface i_myinterface { public function hello(); } class parent_class implements i_myinterface { public function hello()

  • 我创建了一个接口“Polygon”,用于存储抽象方法:“area”和“permiture”。然而,当实现多边形的类在计算面积和周长时涉及不同的计算时,我不理解如何有效地使用接口。在我看来,我甚至不需要接口“多边形”,因为它在我的代码中没有用处。 我已尝试在Triangle类中重写方法“area”,但收到以下错误: 三角形不是抽象的,并且不会覆盖多边形中的抽象方法area() 因为三角区有建造者。我

  • 我试图了解使用接口的好处是什么,以便我可以知道何时以及如何使用它们。互联网上的大多数资源都是相对表面的,解释了接口是如何工作的,但现在为什么要使用它们,当我查找名义上的问题时,我没有得到任何结果告诉我接口的目的是否超出了多态性和多重继承。 我的推理是,如果一个接口只被一个类继承,它将是无用的,当一个接口被多个类继承时,它没有区别,除非它用于多态,唯一使实现不同于扩展的是多重继承。 如果我确实知道他

  • 本文向大家介绍PHP接口多继承及tarits实现多继承效果的方法,包括了PHP接口多继承及tarits实现多继承效果的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP接口多继承及tarits实现多继承效果的方法。分享给大家供大家参考,具体如下: 接口多继承 在PHP的面向对象中,接口可以继承接口。PHP类只能继承一个父类(单继承),但是接口可以实现多继承,可以继承一个或者多个接口