当前位置: 首页 > 面试题库 >

Java中的多继承设计问题

濮嘉茂
2023-03-14
问题内容

您如何处理在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方法和类似的东西)。

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

是否有解决此问题的设计模式?我有一些潜在的解决方案,但我想看看是否缺少一些东西。

谢谢,杰克

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


问题答案:

优先考虑组成而不是继承。

解决方案考虑到可能还有另一种类型的单词可能需要WordLengthSupport。

类似地,可以创建和实现其他接口,并且各种单词类型可以具有这些接口的混合和匹配。

public class WordLength {
    private int length = 0;
    public int getLength(){return length};
    public void setLength(int length){this.length = length};
}

public interface WordLengthSupport {
    public WordLength getWordLength();
}

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);
    }
}

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;
    }
}

策略模式定义 了一系列算法,将每个算法封装在一起,并使它们可互换。策略使算法独立于使用该算法的客户端而变化。

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



 类似资料:
  • 问题内容: 我正在设计一个包含许多主要实体类型的新实验室数据库。 每个实体的表将包含该实体的所有类型(entity_id,created_on,created_by等)通用的字段。然后,我将使用具体继承(每个唯一的属性集使用单独的表)来存储所有剩余字段。 我相信这是每天通过实验室的标准数据类型的最佳设计。但是,我们经常有一个特殊的样本,这些样本通常伴随着原始者想要存储的特定值。 问题: 我应该如何

  • 问题内容: 首先,提供一些指向我参考的页面的链接:一个SO问题,以及有关通用关系和多表继承的Django文档。 到目前为止,我已经建立了一个多表继承设计。对象(例如:汽车,狗,计算机)可以继承Item类。我需要能够从数据库中检索项目,获取子类并对其进行处理。我的设计不允许一一检索不同类型的对象,因此我需要使用Item容器将它们全部包装为一个。有了Item后,Django文档说我可以通过使用模型名称

  • 问题内容: 为了完全理解如何解决Java的多重继承问题,我有一个经典的问题需要澄清。 可以说我有类此有子类和我需要做一个类,从扩展和自既是一只鸟和一匹马。 我认为这是经典的钻石问题。从我能理解经典的方式来解决,这是使,和类接口,并实现从他们。 我想知道是否还有另一种方法可以解决仍然可以为鸟和马创建对象的问题。如果有一种能够创造动物的方法,那也很棒,但不是必须的。 问题答案: 你可以为动物类(生物学

  • 假设我有类,它有子类和,我需要创建一个类,它扩展自和,因为既是鸟也是马。 我想这就是经典的钻石问题。据我所知,解决这个问题的经典方法是将、和类作为接口,并从它们实现。 我想知道是否有另一种方法来解决这个问题,在这个方法中,我仍然可以为鸟和马创建对象。如果有一种方法也能创造动物,那将是伟大的,但不是必要的。

  • 主要内容:多继承下的构造函数,命名冲突在前面的例子中,派生类都只有一个基类,称为 单继承(Single Inheritance)。除此之外, C++也支持 多继承(Multiple Inheritance),即一个派生类可以有两个或多个基类。 多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java、 C#、 PHP 等干脆取消了多继承。 多继承的语法也很简单,将多个基类用逗号隔开即可。例如已声明了类A

  • 这里这个程序似乎使用了多重继承。但是Java不支持多重继承,那么这个程序是如何工作的呢? 当两个类和继承基类时,编译这段代码的原因是什么?