プログラムの状態をロードまたは変更する方法として、各状態の辞書を保存するシーンまたは状態マネージャを作成しようとしています(たとえば、メインメニューの状態とゲーム状態)。基本クラスStateクラスに含まれていない変数を持つ、基本クラスStateクラスの派生クラスがあります。私はこの辞書に安全に保管できますか?データの損失はありますか?これがうまくいかない場合は、私の目標を達成するための代替方法は何ですか?基本クラスに派生クラスを保存する
-1
A
答えて
1
これは簡単にあなた自身をテストできるようです。しかし、ちょうどそれの楽しみのために、あなたのような基底クラスがあるとします。
public class Base
{
public string Name
{
get;
set;
}
public override string ToString()
{
return Name;
}
}
と派生クラスのよう:
Base baseObject = new Base{ Name = "Base"};
Derived derivedObject = new Derived { Name = "Derived", Description = "Description" };
Dictionary<int, Base> dictionary = new Dictionary<int, Base>();
dictionary.Add(1, baseObject);
dictionary.Add(2, derivedObject);
:
public class Derived : Base
{
public string Description
{
get;
set;
}
public override string ToString()
{
return base.ToString() + " - " + Description;
}
}
その後、あなたは、このようなセットアップを作成することができます
情報が失われているかどうかを確認するために少しテストを実行できます:
foreach (Base value in dictionary.Values)
{
Console.WriteLine(value.ToString());
}
ご覧のとおり、正しいオーバーライドToString()
が呼び出されただけでなく、Description
プロパティにも正しい値が残っています。だから、あなたは何も "失う"ことはありません。ただし、タイプがbase
の場合は、直接base
プロパティにしかアクセスできません。
Btw。あなたもチェックし、値が本当にis
あれば、特定の派生型ができます。
foreach (Base value in dictionary.Values)
{
if (value is Derived)
{
Console.WriteLine("{0} is Derived", value.Name);
// trying to access value.Description at this point
// would cause a compiler error "Cannot resolve symbol".
}
else
{
Console.WriteLine("{0} is not Derived", value.Name);
}
}
そしてas
とヌルのチェックと、あなたがすることができ、「安全に」(すなわち例えば直接鋳造によって引き起こされた例外なし)の値を取得します「完全」派生タイプでは、すべての追加プロパティに再度アクセスできます。
foreach (Base value in dictionary.Values)
{
Derived derived = value as Derived;
if (derived != null)
{
Console.WriteLine("{0} is Derived and has Description: {1}",
derived.Name, derived.Description);
// now that derived actually is of type Derived,
// accessing derived.Description is perfectly fine.
}
}
関連する問題
- 1. 基本クラスから派生したインスタンスを保存する
- 2. 利用派生クラス派生クラスは、基本クラス
- 3. 基本クラスと派生クラスのコンストラクタ
- 4. 派生クラスへの基本クラスのキャスト
- 5. 派生クラスを基本クラスにシリアル化する方法は?
- 6. 保存派生クラス型
- 7. 基本クラスの派生クラスオブジェクトを使用
- 8. 派生クラスのインターフェイスメソッドを実装する抽象基本クラス
- 9. 基本クラスから派生クラス名を取得する方法
- 10. ビジュアルベーシックで基本クラスと派生クラスを使用する
- 11. 派生クラスのテンプレート引数を使用する基本クラス
- 12. 基本クラスの派生オブジェクトの参照
- 13. 基本クラス、派生クラス、およびIクラス?
- 14. 派生クラスのコンストラクタを基本クラスのポインタに代入
- 15. 静的型として基本クラスを持つ変数に派生クラスを保存する
- 16. 基本クラスを使用して派生クラスを呼び出す
- 17. 基本クラスのコンストラクタを呼び出す派生クラスのコンストラクタ
- 18. 派生クラスから基本クラスの実装を呼び出す?
- 19. 基本クラスにアクセスできない派生クラスのXmlInclude?
- 20. 基本クラスのweak_ptrですが、shared_ptrは派生クラスですか?
- 21. 派生クラスを持つ基本クラスのオーバーライドプロパティ
- 22. 基本クラスからのポインタを持つC++アクセス派生クラス
- 23. 派生クラスで基本クラスのtypedefを使用
- 24. は、私は、以下の基本クラスを持つ派生クラス
- 25. 基底クラスを派生クラスに変換
- 26. 基本クラスは抽象クラスであり、派生クラスも抽象クラスです。
- 27. 基本クラスのオブジェクトの派生クラスの呼び出しメソッド
- 28. 基本クラスと派生クラスのフレンド関数
- 29. C++のテンプレート<基本クラスと派生クラス>
- 30. 基本クラスで使用し、派生クラスと継承