six*_*ude 8 java inheritance multiple-inheritance
你如何处理在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;}
}
Run Code Online (Sandbox Code Playgroud)
这是我认为我最基本的实现,但我想做其他实现.
让我们说我想添加一个新的变量说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;}
}
Run Code Online (Sandbox Code Playgroud)
我知道java不允许我这样做,但它使我的代码非常难看.现在每当我添加一个字段时,我只是将它添加到AbstractWord,但我要么重命名AbstractWord(以及Word和WordDescriptor).(我不能只是因为向后兼容性而将字段添加到另一个字段,它会破坏等于方法和类似的东西).
这似乎是一个非常常见的设计问题,但我已经绞尽脑汁,我无法想出任何漂亮的解决方案.
是否有解决此问题的设计模式?我有一些潜在的解决方案,但我想知道是否有一些我遗漏的东西.
谢谢,杰克
更新:长度是指单词中的音节数(抱歉缺乏清晰度)
赞成合成而不是继承.
解决方案考虑到可能存在可能需要WordLengthSupport的另一种类型的单词.
类似地,可以创建和实现其他接口,并且各种单词类型可以具有这些接口的混合和匹配.
.
public class WordLength {
private int length = 0;
public int getLength(){return length};
public void setLength(int length){this.length = length};
}
Run Code Online (Sandbox Code Playgroud)
.
public interface WordLengthSupport {
public WordLength getWordLength();
}
Run Code Online (Sandbox Code Playgroud)
.
public class BetterWord extends AbstractWord
implements WordLengthSupport {
WordLength wordLength;
public WordLength getWordLength() {
if(wordLength==null) {
// each time word changes
// make sure to set wordLength to null
calculateWordLength();
}
return wordLength;
}
private void calculateWordLength() {
// This method should be
// called in constructor
// or each time word changes
int length = // based on the variable word calculate Length..
this.wordLength = new WordLength();
this.wordLength.setLength(length);
}
}
Run Code Online (Sandbox Code Playgroud)
.
public class BetterWordDescriptor extends AbstractWord
implements WordLengthSupport {
WordLength wordLength;
public WordLength getWordLength(return wordLength);
public void setWordLength(WordLength wordLength) {
// Use this to populate WordLength of respective word
this.wordLength = wordLength;
}
}
Run Code Online (Sandbox Code Playgroud)
.
策略模式定义了一系列算法,封装了每个算法,并使它们可以互换.策略允许算法独立于使用它的客户端.
此解决方案不使用策略模式,但可以对其进行重构.