В Java, как я могу сделать класс с закрытым конструктором, суперкласс которого также имеет закрытый конструктор? - PullRequest
5 голосов
/ 20 января 2009

Как пример:

public class Foo {
    private Foo() {}
}

public class Bar extends Foo {
    private Bar() {}

    static public doSomething() {
    }
}

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

Могу ли я вызвать Object конструктор из Bar вместо?

Ответы [ 4 ]

10 голосов
/ 20 января 2009

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

(Редактировать - Комментарии в этом сообщении имеют смысл)

7 голосов
/ 21 января 2009

На самом деле это признак плохой формы наследования, называемой наследованием реализации. Либо исходный класс не был предназначен для наследования, и поэтому он решил использовать закрытый конструктор, либо что весь API плохо спроектирован.

Исправление для этого состоит не в том, чтобы выяснить способ наследования, а в том, чтобы выяснить, можете ли вы составить объект вместо наследования, и сделать это через интерфейсы. Т.е. класс Foo теперь является интерфейсом Foo с FooImpl. Затем интерфейсная строка может расширять Foo с помощью BarImpl, который не имеет никакого отношения к FooImpl.

Внутри BarImpl вы можете, если хотите сделать повторное использование кода, иметь внутри FooImpl в качестве члена, но это полностью зависит от реализации и не будет выставлено.

2 голосов
/ 20 января 2009

Вы не сможете создать экземпляр Bar, пока у Foo есть приватный конструктор. Единственный способ сделать это, если у Foo есть защищенный конструктор.

1 голос
/ 20 января 2009

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

Когда вы объявляете конструктор Foo закрытым, он не создает открытый конструктор по умолчанию. Поскольку Bar имеет для вызова конструктора Foo, невозможно оставить его закрытым. Я бы предложил, как и другие, использовать защищенные, а не частные.

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