2016-07-01 16 views
-1

プログラムの状態をロードまたは変更する方法として、各状態の辞書を保存するシーンまたは状態マネージャを作成しようとしています(たとえば、メインメニューの状態とゲーム状態)。基本クラスStateクラスに含まれていない変数を持つ、基本クラスStateクラスの派生クラスがあります。私はこの辞書に安全に保管できますか?データの損失はありますか?これがうまくいかない場合は、私の目標を達成するための代替方法は何ですか?基本クラスに派生クラスを保存する

答えて

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. 
    } 
} 
関連する問題