В минувшие выходные я прочитал кое-что о интерфейсах, абстрактных классах и принципах дизайна. В конце я немного запутался, и я попытался построить пример того, что я узнал (или думал, что узнал).Класс расширяет абстрактные классы. Интерфейс
Вот мой пример: В этом случае будет модель для класса, содержащего информацию о деревьях.
Прежде всего я хотел бы сделать интерфейс:
public interface Tree{
public void grow();
}
Интерфейс содержит все методы, которые должны быть реализованы в конкретных деревьев. Пока что так хорошо, но для такого дерева нужны некоторые атрибуты (переменные), которые распределяются по всем семействам деревьев. Для этой цели я хотел бы использовать абстрактный класс:
public abstract class AbstractTree implements Tree {
private String barColor;
private int maxHeight;
private boolean isEvergreen;
}
Является ли это правильный путь, или я не в состоянии сделать вид договора о атрибуты (переменные), которые должны быть в других классах?
После того, как часть атрибута выполнена, я хотел бы иметь 3 типа деревьев.
- Дуб
- Maple
- Spruce
Таким образом, каждый из этих деревьев "tpyes" может иметь индивидуальные переменные.
public class OakTreeImpl extends AbstractTree{
private String barColor;
private int maxHeight;
private boolean isEvergreen;
private String foo;
@Override
public void grow() {
}
}
Подходит ли этот подход к объектно-ориентированным принципам дизайна или я совершенно не согласен с ним?
AbstractTree следует использовать 'protected' поля, так что вам не нужно переопределить их в реализации –
почему бы не использовать абстрактный класс только вместо этого? – VedX
Я объявляю их защищенными в реферате и удаляю их из Impl-класса? И я все еще могу получить доступ (получить/установить) значения переменных, даже если я не вижу их непосредственно в классе? – user2742409