我有一个类(Base)和一个 InfoBase 类型的字段,其中包含一些信息。Base 的专业化(Ext)需要保存附加信息(InfoExt)。因此,Ext 将 InfoExt 分配给 Base.info。但是,当 Base 替换 info 时我遇到了问题,因为它会分配info = new InfoBase()
因此 InfoExt 的附加信息丢失。
因此,我创建了一个abstract void assign()
in Base(变体 A)。在这种情况下,每次在 Ext 中使用时,都需要将 info 转换为 InfoExt。
因此,在变体 BI 中还创建了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 中提供一个 info 字段,子类可以用来存储扩展信息?
谢谢您的考虑