私はクラス(Base)といくつかの情報を保持するタイプのInfoBaseのフィールドを持っています。 Baseの特殊化(Ext)は、追加情報(InfoExt)を保持する必要があります。 したがって、ExtはInfo.ExをBase.infoに割り当てます。しかし、 ベースは、info = new InfoBase()
を割り当てているので、Infoを置き換えると問題に遭遇しました。したがって、 InfoExtの追加情報は失われています。基本メンバーフィールドを拡張する方法は?
したがって、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に情報フィールドを提供するにはどうすればよいですか?あなたはそれのデータはほとんどアクセスされるInfoBaseの1つのサブクラスを持っている場合
あなたはInfoExtに基本クラスにプロパティ「情報」の種類を変更する必要があり、ご検討
あなたの問題を理解しているかどうかわからないのですが、問題は「情報」が常にキャストされる必要があると言われましたが、AまたはBのどちらでも問題は解決しませんでした。 –
In B:Ext'.info InfoExt型であるため、Ext 'はキャストなしでInfoExtとしてInfoExtにアクセスできます(InfoBaseからInfoExtへ)。これが明確になることを願っています。 –
あなたの問題は、オブジェクトに情報を要求して、何をすべきかを伝えていないと思います。http://pragprog.com/articles/tell-dont-ask – SpaceTrucker