循环继承使用

Val*_*eri 7 java inheritance

所以如果我用Java编写以下代码:

public class A extends A{
    public static void main(String[] args){
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

这对我来说很有意义,因为很难想象无论如何这都是可能的.

然后我从我的大学的一位教授那里询问了这件事.他说有些语言是可能的,他感叹遗憾的是,这在Java中是不可能的,并且他已经完成了一些他曾使用过循环继承等项目,但我真的无法理解它.他还提到他曾经有过他希望使用循环继承的问题.

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

ale*_*dez 6

我挖出了这个有趣的参考:基本上它表示循环继承是有效的,只要没有重复的字段,因为任何字段的查找只需要遍历循环的一个循环以找出含义.如果一个字段重复,那么这两个定义中没有一个比另一个更有效,并且显然会出现问题.

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

class Person extends Human:
  String name;

class Human extends Voter:
  String language;

class Voter extends Person:
  Country residence;
Run Code Online (Sandbox Code Playgroud)

现在,您可以在不必定义层次结构的情况下处理个人的不同方面,并且可以将不同的人实例化为Person(具有名称),Human(表示语言)或Voter(在特定国家/地区).没有哪个方面比另一方面更重要.

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

更新:给定的伪代码在转换为Java 8时不会编译,并且显然在任何语言下(Cecil除外,如上面给出的链接所示).似乎没有人发现任何有效用途,因此不允许循环继承.这并不意味着这个概念本来就不可能; 只是实际用途并不能证明实施特殊情况的努力是正确的.