Модификатор доступа к конструктору абстрактных классов - PullRequest
26 голосов
/ 04 ноября 2008

Абстрактный класс может использоваться только как базовый класс, который расширяется другим классом, верно? Конструктор (ы) абстрактного класса может иметь обычные модификаторы доступа (открытый, защищенный и закрытый (для внутреннего использования)). Какой из protected и public является правильным для использования модификатором доступа, поскольку абстрактный тип, по-видимому, указывает на то, что технически открытый конструктор будет действовать очень защищенно? Должен ли я просто использовать защищенный для всех моих конструкторов?

Ответы [ 4 ]

24 голосов
/ 04 ноября 2008

поскольку абстрактный тип, по-видимому, указывает на то, что технически публичный конструктор будет действовать очень защищенно

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

Таким образом, абстрактный класс, безусловно, может иметь открытые конструкторы.

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

public class Scratch
{
    public static abstract class A
    {
        public A( int i ) {}
    }

    public static class B extends A
    {
        private B() { super(0); };
    }
}
7 голосов
/ 04 ноября 2008

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

1 голос
/ 04 ноября 2008

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

Другой вариант - сделать конструктор приватным. Это только хорошая идея, если все реализации класса являются закрытыми внутренними классами. Редкий, но полезный пример.

1 голос
/ 04 ноября 2008

поскольку абстрактный тип, по-видимому, указывает на то, что технически публичный конструктор будет действовать очень защищенно

Умм ... для абстрактных классов эта область конструктора [публичная или защищенная] не имеет большой разницы, поскольку создание экземпляров не допускается [даже если публично]. Поскольку он предназначен для вызова подклассом, он может без проблем вызывать открытый или защищенный конструктор.

Это полностью на выбор, что использовать. Я вообще предпочитаю общественность, как это бывает в большинстве случаев.

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