我有一个类(Base)和一个InfoBase类型的字段,其中包含一些信息。一个
Base的specialization(Ext)需要保存附加信息(InfoExt)。
因此,Ext将InfoExt分配给Base.info。但是我遇到了问题
Base替换了info,因为它会分配info = new InfoBase()
因此
InfoExt的其他信息丢失了。
因此我在Base中创建了abstract void assign()
(变体A)。在这
每次在Ext。
在变体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中提供一个信息字段,子类可以用来存储扩展信息?
感谢您的考虑
答案 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 投射到正确的类。
这是最简单的设计。由于我不知道代码的复杂性,我无法为您提供更具体的解决方案;但您也可以考虑使用适配器模式,策略或状态(当然,取决于要解决的问题)。