Java中的多继承设计问题

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).(我不能只是因为向后兼容性而将字段添加到另一个字段,它会破坏等于方法和类似的东西).

这似乎是一个非常常见的设计问题,但我已经绞尽脑汁,我无法想出任何漂亮的解决方案.

是否有解决此问题的设计模式?我有一些潜在的解决方案,但我想知道是否有一些我遗漏的东西.

谢谢,杰克

更新:长度是指单词中的音节数(抱歉缺乏清晰度)

Gla*_*boz 9

赞成合成而不是继承.

解决方案考虑到可能存在可能需要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)

.

策略模式定义了一系列算法,封装了每个算法,并使它们可以互换.策略允许算法独立于使用它的客户端.

此解决方案不使用策略模式,但可以对其进行重构.