Java – абстрактный класс, содержащий переменные?
Вопрос
Хорошо ли позволять абстрактным классам определять переменные экземпляра?
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, не сломают его.