クラス (Base) と、いくつかの情報を保持するタイプ InfoBase のフィールドがあります。Base の特殊化 (Ext) は、追加情報 (InfoExt) を保持する必要があります。したがって、Ext は InfoExt を Base.info に割り当てます。ただし、Base が情報を置き換えるときに問題が発生しました。これは、割り当てられるinfo = new InfoBase()
ため、InfoExt の追加情報が失われるためです。
したがってabstract void assign()
、ベース(バリアントA)で作成しました。この場合、情報は Ext で使用されるたびに 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 に提供するにはどうすればよいですか?
ご検討をお願いいたします