如何扩展基础成员字段?

时间:2013-01-08 14:35:22

标签: java

我有一个类(Base)和一个InfoBase类型的字段,其中包含一些信息。一个 Base的specialization(Ext)需要保存附加信息(InfoExt)。 因此,Ext将InfoExt分配给Base.info。但是我遇到了问题 Base替换了info,因为它会分配info = new InfoBase()因此 InfoExt的其他信息丢失了。

因此我在Base中创建了abstract void assign()(变体A)。在这 每次在Ext。

中使用时,都需要将案例信息转换为InfoExt

在变体B中,我另外创建了abstract InfoBase info()

                             variant A                        variant B
+----------------+  +---------------------------+  +----------------------------+
| InfoBase       |  | Base                      |  | Base'                      |
|----------------|  |---------------------------|  |----------------------------|
| + name: String |  | + info: InfoBase          |  | + abstract InfoBase info() |
|                |  | + abstract void assign()  |  | + abstract void assign()   |
|                |  |                           |  |                            |
+----------------+  +---------------------------+  +----------------------------+
          ^                      ^                               ^
          |                      |                               |
          +                      +                               +
+----------------+  +---------------------------+  +----------------------------+
| InfoExt        |  | Ext                       |  | Ext'                       |
|----------------|  |---------------------------|  |----------------------------|
| + id: int      |  | + void assign() {         |  | + InfoExt info             |
|                |  |     info = new InfoExt(); |  | + InfoBase info() {        |
|                |  |   }                       |  |     return info;           |
+----------------+  +---------------------------+  |   }                        |
                                                   | + void assign() {          |
                                                   |     info = new InfoExt();  |
                                                   |   }                        |
                                                   +----------------------------+

 class InfoBase {
   public String name;
 }

 abstract class Base {
    abstract public void assign();
    abstract InfoBase info();
 }


 class InfoExt extends InfoBase {
   public int id;
 }

 class Ext extends Base {
    public InfoExt info;

    @Override InfoBase info() { return info; }

    @Override public void assign() { info = new InfoExt(); }
 }

这是一种常见的情况,如何处理它?在那儿 变体A / B的任何缺点?

如何在Base中提供一个信息字段,子类可以用来存储扩展信息?

感谢您的考虑

4 个答案:

答案 0 :(得分:1)

也许你正在寻找这样的东西?

abstract class Base {
    private InfoBase info; 

    abstract public void assign();

    protected void setInfo(InfoBase info) {
        this.info = info;
    }

    public InfoBase getInfo() { 
        return info;
    }
}

class Ext extends Base {
    private InfoExt info;

    @Override 
    public InfoExt getInfo() { 
        return info;
    }

    @Override
    public void assign() {
        info = new InfoExt();
        setInfo(info);
    }

}

这将允许Base提供InfoBase个对象,而Ext可以提供InfoExt

答案 1 :(得分:0)

如果您有一个InfoBase的子类,它的数据将被大部分访问,您应该将Base Class中的属性'info'的类型更改为InfoExt。

在不久的将来,也许你会有任何其他InfoBase子类有不同的数据和行为,你怎么做? 在这种情况下,我建议你使用GOF的Bridge-Pattern,它会帮助你解决它。

答案 2 :(得分:0)

如果您正在寻找避免投射的方法,这可能会起作用(使用泛型):

public abstract class Base<T extends InfoBase> {
    protected T info;

    public T info(){
        return info;
    }

    public abstract void assign();
}


public class ExtBase extends Base<InfoExt> {

    @Override
    public void assign() {
        info = new InfoExt();   
    }
}

Info将是子类ExtBase的InfoExt类型。例)

ExtBase b = new ExtBase();
b.info() // Returns Type InfoExt

答案 3 :(得分:0)

我不完全理解你的问题,但这里有一个提示:

通常,在实例化Base子类时,您将让每个子类在子类重写的第二个方法( initialize 或类似的东西)中执行其特定语句。因此,例如,每个子类都将使用特定的 InfoBase 子类实例化 info

之后, Ext 应该只覆盖需要InfoBase特定行为的方法,将 info 投射到正确的类。

这是最简单的设计。由于我不知道代码的复杂性,我无法为您提供更具体的解决方案;但您也可以考虑使用适配器模式,策略或状态(当然,取决于要解决的问题)。