Использование циклического наследования

поэтому, если я напишу следующий код на Java:

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

Это дает сообщение об ошибке компилятора циклическое наследование с участием A.

то же самое происходит, если я пишу два класса A и B и A наследует B и B наследует A.

Это имеет смысл для меня, так как довольно трудно представить, как это было бы возможно в любом случае.

5 ответов


я выкопал этот интересные ссылки: в основном он говорит, что циклическое наследование допустимо до тех пор, пока нет повторяющихся полей, так как для поиска любого поля просто нужно пересечь один цикл цикла, чтобы узнать значение. Если поле повторяется, то ни одно из двух определений не является более допустимым, чем другое, и, по-видимому, возникла бы проблема.

предположим, что вы хотите определить человека как человека и избирателя и установить разные атрибуты для каждый. В псевдокоде:

class Person extends Human:
  String name;

class Human extends Voter:
  String language;

class Voter extends Person:
  Country residence;

теперь вы можете обращаться к различным аспектам человека без необходимости определять иерархию, и вы можете создавать разные люди как человек (с именем), Человек (который говорит на языке) или избиратель (в конкретной стране). Ни один аспект не является более важным, чем другой.

хотя это интересно, я не думаю, что это практично использовать вне исследовательских проектов. Представьте, что у вас есть конструкторы для всех классов, которые передают параметры конструкторы super () - было бы легко испортить всю конструкцию.

Update: данный псевдокод не компилируется при переводе на Java 8 и, по-видимому, на любом языке (кроме Cecil, как показано по приведенной выше ссылке). Похоже, что никто не нашел никаких допустимых применений и поэтому запретил циклическое наследование. Это не означает, что концепция по своей сути невозможна; просто практическое использование не оправдывает усилий по реализации особого случая.


Я не согласен с принятым ответом, в котором говорится, что их код не будет выдавать ошибку. Я использую Java 8 и скомпилировал следующий код:

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

и я получил сообщение об ошибке " ошибка: циклическое наследование с участием человека."

поэтому в Java вы не можете иметь циклическое наследование.


Я мог видеть это возможным, только если классы были на одном уровне иерархии. Думаю, иерархия классов в виде дерева, котором он. Java ищет иерархию как минимум на один уровень выше или больше. В некоторых языках можно наследовать характеристики класса на том же уровне, что и используемый класс.


Я не понимаю смысла циклического наследования. Я не знаю, почему ваш профессор думает, что полезно в разуме anycase, что наследование, которое называется IS-A отношение утверждает, что если B является подклассом A, то B-A в том смысле, что везде требуется A, тогда B можно использовать без проблем (принцип подстановки Лисков).

теперь, теоретически, если A является подклассом B и B является подклассом A, то оба класса должны точно такой же внешний интерфейс. Это потому, что если вы добавляете метод к любому из них, другой автоматически наследует тот же метод, поэтому вам придется либо переопределить его, либо получить другую реализацию.

кроме того, у вас будет много обстоятельств, в которых нечетные побочные эффекты вступают в игру (подумайте о методе A.foo() вызов super.foo() и B.foo() вызов super.foo(). Я не вижу никакой практической причины, потому что это должно быть допустимый.

наследование предназначено как дерево, в котором каждый подкласс определяет поведение или классы, которые находятся в дереве, наличие двух классов на одном уровне не означает ничего полезного.


циклическое наследование бесполезно и, кроме того, давайте посмотрим, почему логически это не допускается.

Я хотел бы начать с Object class, если класс не расширяет какой-либо класс, он расширяет Object class (это правда), и если класс расширяет любой другой класс косвенно расширяет Object класса.

пример:

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

класс A выходит Object, потому что B класс расширяется Object класс.

поэтому, когда мы делаем Циклическое Наследование, он никогда не расширял класс объектов.

пример:

class A extends A
{
}

надеюсь, я был ясен, так и класс, который не может продлить Object класс, который невозможен в Java.