Как вы справляетесь с единственным наследованием в Java? Вот моя конкретная проблема:
У меня есть три (упрощенных) класса:
public abstract class AbstractWord{
String kind; // eg noun, verb, etc
public String getKind(){ return kind; }
}
public class Word extends AbstractWord{
public final String word;
ctor...
public void setKind(){
// based on the variable word calculate kind..
}
}
public class WordDescriptor extends AbstractWord{
ctor..
public void setKind(String kind){this.kind = kind;}
}
Это то, что я считаю своей самой базовой реализацией, но я хочу сделать другие реализации.
Допустим, я хочу добавить новую переменную, скажем, wordLength, но я хочу добавить ее с помощью наследования. Это означает, что я НЕ хочу изменять этот исходный класс AbstractWord. То есть что-то вроде этого:
public class Length{
private int length;
public int getLength(){return length};
}
public class BetterWord extends AbstractWord AND Length{
public void setLength(){
// based on the variable word calculate Length..
}
}
public class BetterWordDescriptor extends AbstractWord AND length{
public void setLength(int length){this.length = length;}
}
Я знаю, что java не позволяет мне это сделать, но это сделало мой код очень уродливым. Прямо сейчас, когда я добавляю поле, я просто добавляю его в AbstractWord, но затем мне нужно либо переименовать это AbstractWord (и Word, и WordDescriptor). (Я не могу просто добавить одно поле к другому из-за обратной совместимости, оно нарушает методы equals и тому подобное).
Это кажется довольно распространенной проблемой дизайна, но я ломал голову и не могу придумать красивого решения.
Есть ли шаблон проектирования, который решает эту проблему? У меня есть несколько потенциальных решений, но я хотел посмотреть, есть ли что-то, чего мне не хватает.
спасибо, Джейк
Обновление: длина относится к количеству слогов в слове (извините за отсутствие ясности)
Length
быть классом, а не интерфейсом? - person David R Tribble   schedule 27.01.2010