2016-07-01 15 views
-1

ich eine Szene oder Status-Manager zu erstellen versuchen, die für jeden Zustand als eine Möglichkeit, ein Wörterbuch speichert zu laden oder den Zustand des Programms zu ändern (zum Beispiel eines Hauptmenü Zustand und einem Spielstatus). Ich habe eine Reihe abgeleiteter Klassen der Basisklasse State mit Variablen, die nicht in der Basis-State-Klasse enthalten sind. Kann ich sie sicher in diesem Wörterbuch speichern? Habe ich einen Datenverlust? Wenn das nicht funktioniert, was sind alternative Methoden, um mein Ziel zu erreichen?Speicher von abgeleiteten Klassen in einer Basisklasse Wörterbuch

Antwort

1

Das scheint etwas zu sein, das man leicht selbst testen könnte. Aber nur für den Spaß von ihm, nehme an, Sie haben eine Basisklasse wie:

public class Base 
{ 
    public string Name 
    { 
     get; 
     set; 
    } 

    public override string ToString() 
    { 
     return Name; 
    } 
} 

und eine abgeleitete Klasse wie:

public class Derived : Base 
{ 
    public string Description 
    { 
     get; 
     set; 
    } 

    public override string ToString() 
    { 
     return base.ToString() + " - " + Description; 
    } 
} 

Dann können Sie ein Setup wie folgt erstellen:

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); 

Jetzt können Sie einen kleinen Test ausführen, um zu sehen, ob Informationen verloren sind:

foreach (Base value in dictionary.Values) 
{ 
    Console.WriteLine(value.ToString()); 
} 

Wie Sie sehen können, ist nicht nur die richtige überschrieben ToString() genannt, aber es hat auch noch den richtigen Wert für die Description Eigenschaft. Also nein, du "verlierst" nichts. Aber solange es sich um einen base Typ handelt, können Sie nur direkt auf die base Eigenschaften zugreifen.

Btw. Sie können auch überprüfen, ob ein Wert wirklich is einen bestimmte abgeleiteter Typ:

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); 
    } 
} 

Und mit as und einer Prüfung auf null, können Sie „sicher“ (dh ohne durch direktes Gießen beispielsweise verursacht Ausnahme) erhält den Wert in dem „vollen“ abgeleiteten Typ, wo können Sie alle zusätzliche Eigenschaften wieder zugreifen:

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. 
    } 
} 
Verwandte Themen