Java – абстрактный класс, содержащий переменные?

StackOverflow https://stackoverflow.com/questions/236211

Вопрос

Хорошо ли позволять абстрактным классам определять переменные экземпляра?

public abstract class ExternalScript extends Script {

    String source;

    public abstract void setSource(String file);

    public abstract String getSource();
}

Подкласс ExternalJavaScript.class автоматически получит исходную переменную, но я считаю, что код будет легче читать, если все подклассы сами определяют источник, а не наследуют.

Какой ваш совет?

/Адам

Это было полезно?

Решение

Я бы подумал, что что-то вроде этого было бы намного лучше, поскольку вы добавляете переменную, так почему бы не ограничить доступ и не сделать ее чище?Ваши геттеры/сеттеры должны делать то, что они говорят на банке.

public abstract class ExternalScript extends Script {

private String source;

public void setSource(String file) {
    source = file;
}

public String getSource() {
    return source;
}

Возвращаясь к вопросу, вы когда-нибудь удосуживались посмотреть, где находится код получения/установки при его чтении?Если все они выполняют получение и установку, вам не нужно беспокоиться о том, что «делает» функция при чтении кода.Есть и еще несколько причин, о которых стоит задуматься:

  • Если исходный код был защищен (поэтому доступен подклассам), код становится беспорядочным:кто меняет переменные?Когда это объект, тогда становится сложнее выполнить рефакторинг, тогда как метод имеет тенденцию облегчать этот шаг.
  • Если ваши методы получения/установки не получают и не устанавливают, опишите их как-то иначе.

Всегда думайте, действительно ли ваш класс отличается от других, и это должно помочь решить, нужно ли вам что-то еще.

Другие советы

Конечно..Почему нет?
Абстрактные базовые классы — это просто удобство размещения поведения и данных, общих для двух или более классов, в одном месте для повышения эффективности хранения и обслуживания.Это деталь реализации.
Однако будьте осторожны, чтобы вы не использовали абстрактный базовый класс там, где вам следует использовать интерфейс.Ссылаться на Интерфейс против базового класса

Конечно.Вся идея абстрактных классов заключается в том, что они могут содержать некоторое поведение или данные, которые вы требуете от всех подклассов.Подумайте о простом примере WheeledVehicle — он должен иметь переменную-член numWheels.Вы хотите, чтобы все подклассы имели эту переменную.Помните, что абстрактные классы — очень полезная функция при разработке API, поскольку они могут гарантировать, что люди, расширяющие ваш API, не сломают его.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top