Почему супер.супер.метод (); не разрешено в Java? - PullRequest
337 голосов
/ 25 февраля 2009

Я прочитал этот вопрос и подумал, что его легко решить (а не без него), если бы можно было написать:

@Override
public String toString() {
    return super.super.toString();
}

Я не уверен, что это полезно во многих случаях, но мне интересно , почему это не так, и если что-то подобное существует в других языках.

Что вы, ребята, думаете?

EDIT: Чтобы уточнить: да, я знаю, это невозможно в Java, и я действительно не скучаю по этому. Это ничего, что я ожидал работать, и был удивлен, получив ошибку компилятора. У меня просто была идея, и я хотел бы обсудить ее.

Ответы [ 22 ]

0 голосов
/ 09 апреля 2014

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

Вы просто не можете выбрать вишню из суперкласса .

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

Нарушение инкапсуляции - это когда вы @ переопределяете некоторые методы, разбивая инкапсулированный код. Методы, разработанные, чтобы не быть переопределенными, отмечены * * Окончательный тысячу двадцать-один * * тысяча двадцать-два.

0 голосов
/ 04 июня 2011

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

public class Foo
{
  public int getNumber()
  {
    return 0;
  }
}

public class SuperFoo extends Foo
{
  public static Foo superClass = new Foo();
  public int getNumber()
  {
    return 1;
  }
}

public class UltraFoo extends Foo
{
  public static void main(String[] args)
  {
    System.out.println(new UltraFoo.getNumber());
    System.out.println(new SuperFoo().getNumber());
    System.out.println(new SuperFoo().superClass.getNumber());
  }
  public int getNumber()
  {
    return 2;
  }
}

Следует распечатать:

2
1
0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...