Подтвердить что ты не робот

Абстрактный модификатор доступа к конструктору класса

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

4b9b3361

Ответ 1

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

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

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

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

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

    public static class B extends A
    {
        private B() { super(0); };
    }
}

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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