Java: по умолчанию наследуют все конструкторы суперкласса - PullRequest
0 голосов
/ 28 июня 2019

Я только новичок в Java.

В моем суперклассе есть несколько конструкторов:

public class Superclass {
    protected Superclass () {
        //some stuff
    }

    protected Superclass (typeA a){
        //some other stuff
    }

    protected Superclass (typeB B){
        //another stuff
    }
}

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

public class Subclass extends Superclass {
    protected Subclass () {
        super();
        //subclass stuff
    }

    protected Subclass (typeA a){
        super(typeA a);
        //the same subclass stuff
    }

    protected Subclass (typeB B){
        super(typeB B);
        //the same subclass stuff
    }
}

Существует ли в Java что-то для наследования всех конструкторов суперкласса?Потому что я не хочу копировать код пасты, но хочу сделать так:

@InheritsAllConstructors
public class Subclass extends Superclass {
    {
        //some stuff
    }
}

Или есть более подходящее решение?)

1 Ответ

0 голосов
/ 28 июня 2019

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

  • Суперкласс не имеет явных конструкторов : Подклассыне обязательно иметь явный конструктор.
  • У суперкласса есть один явный конструктор : у подклассов должен быть хотя бы один конструктор.Конструктор в подклассе не должен совпадать с конструктором в суперклассе, но он должен вызывать его, используя super(...)
public class Super {

    public Super(String value) {
        //...
    }
}

Подклассы должны предоставлять конструктор, который вызывает super(..): Вот так:

private class Sub extends Super {

    public Sub(String value) {
        super(value);
    }
}

Или даже так:

private class Sub extends Super {

    public Sub() {
        super("some default value");
    }
}
  • Суперкласс имеет более одного явного конструктора : подклассы вынуждены предоставлять хотя бы один конструктор, который вызываетлюбой из конструкторов суперкласса:
public class Super {

    public Super(String value) {
        //...
    }

    public Super(int intValue) {
        //...
    }
}

Подклассами могут быть любые из следующих:

private class Sub extends Super {

    public Sub() {
        super("some default value");
    }
}

Или:

private class Sub extends Super {

    public Sub(String value) {
        super(value);
    }
}

Или:

private class Sub extends Super {

    public Sub(int intValue) {
        super(intValue);
    }
}

Или любая комбинация этих конструкторов.

...