2013-08-26 4 views
5

я хочу сделать следующее вещь:Как неявно вызывать конструктор родительского класса

class P { 
    P(int a) { 
    // construct 
    } 
} 

class C extends P { 
} 

// in main 
int a = 2; 
C foo = new C(a); // can I do this? 

Я хочу создать дочерний объект C помощью вызова конструктора родительского класса P без написания какого-либо конструктора в классе C, как «супер (а)» , Это возможно?

Идея состоит в том, что у меня много классов, таких как «класс C», которые нуждаются в тех же конструкторских функциях, что и «класс P». Поэтому я не хочу писать метод конструктора каждый раз, когда создаю новый подобный класс.

Thanks

+1

Вы не можете вызвать конструктор с аргументом, не написав конструктор, который принимает аргумент. Ваш вопрос не имеет смысла. – EJP

ответ

3

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

Единственный конструктор, с помощью которого можно избежать объявления, является конструктором no-arg по умолчанию, и только в том случае, если вы не объявляете никаких конструкторов. Это потому, что компилятор будет генерировать один для вас, если у вас нет объявленных конструкторов. Компилятор всегда вставляет вызов конструктору суперкласса по умолчанию, если вы явно не вызываете конструктор суперкласса.

Обратите также внимание, что если вы явно не вызываете конструктор суперкласса и в суперклассе нет конструктора по умолчанию, вы получите ошибку времени компиляции.

EDIT: Если у вас есть «много классов, таких как класс C», то альтернативой написанию большого количества конструкторов является использование factory method pattern. Вы можете, чтобы все классы реализовали конструктор по умолчанию и предоставили отдельный метод init(), который принимает стандартный набор аргументов. Метод factory примет объект Class<? extends C> и некоторые аргументы инициализации, сгенерирует новый экземпляр (используя конструктор по умолчанию) и вызовет его метод init с аргументами инициализации. Таким образом вам нужно только переопределить метод init для тех подклассов, которым требуется специальная обработка (всегда помните, чтобы позвонить до super.init).

+0

: public class B {protected int a;} класс C расширяет B {proctected void init (int a) {this.a = a;}} class Factory {public static C getC (класс c, int a) { C cInstance = c.newInstance(); cInstance.init (a); return cInstance;} класс D расширяет C {@override procted void init (int a) {super.init (a); ...}}? –

+0

@ user2245634 - Я бы поставил 'init' в' B'. Кроме того, заводским методом будет общий метод в 'B'; вам не нужен отдельный класс.'C' и' D' не нужно переопределять 'init' для инициализации' a' (хотя они могут потребоваться для другой инициализации). –

+0

спасибо, но если шаблон фабричного метода должен использовать заводский класс для создания экземпляра или вызвать новый B() и т. Д., То будет опускать метод init –

2
  • Конструктор неявно вызывает параметр меньше конструктор из его непосредственного суперкласса (только если нет явного вызова)
  • Когда вы определяете собственный конструктор, конструктор по умолчанию не будет создан.

Таким образом, в вашем случае класса C имеет конструктор по умолчанию, который будет пытаться неявно вызывать конструктор по умолчанию класса P, который не завершает работу и провалится.

Таким образом, вы должны сделать это таким образом

class P 
{ 
    public P(int a) 
    { 
    // construct 
    } 
} 

class C extends P 
{ 
    public C(int x) 
    { 
     super(x); 
    } 
} 
+1

Конструктор по умолчанию неявно вызывает конструктор без параметров его непосредственного суперкласса ** только **, если конструктор по умолчанию явно не вызывает конструктор суперкласса. Однако это верно для конструктора _any_, по умолчанию или нет. –

+0

@TedHopp ohh yes..indeed..its применимо к любому конструктору ..edited ans..thx – Anirudha

+0

Ну .. мы также должны отметить, что _super (x) _ должен быть самой первой строкой в ​​конструкторе дочернего класса. –

Смежные вопросы