8

因此,如果我用 Java 编写以下代码:

public class A extends A{
    public static void main(String[] args){
    }
}

这给出了涉及 A 的编译器错误消息循环继承。

如果我编写两个类 A 和 B 并且 A 继承 B 并且 B 继承 A,也会发生同样的情况。

这对我来说很有意义,因为很难想象这怎么可能。

然后,我向我大学的一位教授询问了这个问题。他说有些语言可以做到这一点,他感叹这在 Java 中是不可能的,并且他做过一些使用循环继承等的项目,但我无法真正理解其中的任何一个。他还提到他曾遇到过希望使用循环继承的问题。

你能告诉我这种奇怪的循环继承现象的可能用途吗?什么时候有可能,怎么做?有什么问题可能有用吗?

4

5 回答 5

7

我挖出了这个有趣的参考资料:基本上它说只要没有重复的字段,循环继承就有效,因为查找任何字段只需要遍历循环的一个循环即可找出含义。如果一个字段被重复,那么这两个定义中没有一个比另一个更有效,显然会有问题。

因此,假设您要将一个人定义为人类和选民,并为每个人设置不同的属性。在伪代码中:

class Person extends Human:
  String name;

class Human extends Voter:
  String language;

class Voter extends Person:
  Country residence;

现在您可以解决个人的不同方面而无需定义层次结构,并且您可以将不同的人实例化为人(有名字)、人(说某种语言)或选民(在特定国家/地区)。没有哪个方面比其他方面更重要。

虽然很有趣,但我认为在研究项目之外使用它并不实用。想象一下,为所有将参数传递给 super() 构造函数的类都有构造函数——很容易弄乱整个构造。

更新:给定的伪代码在翻译成 Java 8 时无法编译,显然在任何语言下(除了上面给出的链接所示的 Cecil)。似乎没有人发现任何有效的用途,因此不允许循环继承。这并不意味着这个概念本质上是不可能的;只是实际用途并不能证明实施特殊情况的努力是合理的。

于 2012-11-20T00:07:13.657 回答
1

如果这些类位于同一层次结构中,我只能看到它是可能的。将类层次结构视为一棵树,它就是这样。Java 会寻找至少高于或更高级别的层次结构。在某些语言中,您将能够从与您正在使用的类处于同一级别的类继承特征。

于 2012-11-19T23:14:18.150 回答
1

我没有循环继承的感觉。我不知道为什么你的教授认为它在任何情况下都是有用的,即称为IS-A关系的继承关系指出如果 B 是 A 的子类,那么 B IS-A A 在任何地方都需要 A 的意义上a B 可以毫无问题地使用(里氏替换原则)。

现在,理论上,如果 A 是 B 的子类并且 B 是 A 的子类,那么这两个类必须具有完全相同的外部接口。这是因为如果您向其中任何一个添加一个方法,另一个将自动继承相同的方法,因此您必须要么重写它以获取另一个实现。

此外,您将在许多情况下发挥奇怪的副作用(想想方法A.foo()调用super.foo()B.foo()调用super.foo()。我没有看到任何实际原因,因为这应该是允许的。

继承旨在作为一棵树,其中每个子类都指定树中的行为或类,在同一级别有两个类并不意味着任何有用。

于 2012-11-19T23:19:26.897 回答
1

我不同意接受的答案,即他们的代码不会引发错误。我正在运行 Java 8 并编译了以下代码:

class Person extends Human:
  String name;
class Human extends Voter:
  String language;
class Voter extends Person:
  String residence;

我收到一条错误消息,指出“错误:涉及 Person 的循环继承”。

因此,在 Java 中不能有循环继承。

于 2016-05-04T19:54:59.183 回答
1

循环继承是没有用的,而且让我们看看为什么在逻辑上它是不允许的。

我想从Object类开始,如果一个类不扩展任何类它扩展Object类(这是真的),如果一个类扩展任何其他类间接扩展Object该类。

例子:

class B
{
..//
}
class A extends B
{
...//
}

A扩展Object,因为B类扩展Object类。

所以当我们做Cyclic Inheritance时,它​​从未扩展 Object 类。

例子:

class A extends A
{
}

我希望我很清楚,所以一个不能扩展Object类的类在 Java 中是不可能的。

于 2017-10-03T18:41:01.893 回答