Как пропустить один уровень в наследовании, вызывающем супер от бабушки и дедушки в Java?

У меня есть три простых класса:

class A {
  public A(int a){ }
}

class B extends A {
  public B(int b){ super(b); }
}

class C extends B {
  public C(int c){ super(c); }
}

Итак, порядок выполнения во время создания экземпляра класса: C-> B-> A-> B-> C, и все объекты создаются правильно. Тогда вопрос:

МОГУ Я каким-то образом написать конструктор для класса C следующим образом:

  public C(int c){
    super.super(c);
  }

Идея состоит в том, чтобы вызвать конструктор из класса A, а не из непосредственного родителя B. Возможно ли это?


person piotao    schedule 04.11.2016    source источник
comment
Что ж, здесь нет переопределяемых методов, поэтому просто вызовите A(c). (Я предполагаю, что это опечатка - пожалуйста, исправьте свой код, чтобы на самом деле проиллюстрировать вашу проблему).   -  person Andy Turner    schedule 04.11.2016
comment
В настоящий момент код даже не компилируется, потому что вы не объявляете конструкторы - вы объявляете методы с такими же именами, как и классы.   -  person Jon Skeet    schedule 04.11.2016
comment
Полагаю, A должен быть конструктором. OP, возможно, стоит подумать о своей архитектуре.   -  person Jeremy    schedule 04.11.2016
comment
возможно дублирование вопроса и другой   -  person Karthik    schedule 04.11.2016
comment
Наследование является безусловным, поэтому не расширяйте его, если на самом деле вам не нужна часть B каждый раз. Создайте класс, который расширяется непосредственно от A, и в случае, если у него должно быть что-то общее с другими, что не наследуется, напрямую поместите это в общий interface. Отсутствие возможности пропустить занятие - это не ограничение, это проблема дизайна на вашей стороне.   -  person zapl    schedule 04.11.2016
comment
Спасибо. На самом деле я переработал код, конструкторы в порядке, и у меня больше нет проблем с ними. Однако у меня очень похожая проблема в этой простой иерархии классов: в классах A, B и C у меня есть функция makeStr, которая создает некоторую строку. В B.makeStr я вызываю super.makeStr из класса A, но в классе C я не могу вызвать super.super.makeStr из A, опуская класс B. Как преодолеть это ограничение?   -  person piotao    schedule 07.11.2016


Ответы (1)


Нет, ты не можешь этого сделать.

Все классы в иерархии должны быть созданы. Вы не можете обойти построение B.

Что вы могли сделать, так это написать protected конструктор в B, который, по сути, не работает, и вызвать его из конструктора в C.

person Bathsheba    schedule 04.11.2016