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
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.
}
}
- 1. Initialisiere die Basisklasse zu einer abgeleiteten Basisklasse?
- 2. Karte von abgeleiteten Klassen
- 3. Definieren Sie die undefinierte Methode der Basisklasse in abgeleiteten Klassen
- 4. Mehrfachvererbung von zwei abgeleiteten Klassen
- 5. Verwenden einer Basisklasse und einer abgeleiteten Klasse in Visual Basic
- 6. weak_ptr einer Basisklasse, während shared_ptr von einer abgeleiteten Klasse ist?
- 7. Serialisieren einer abgeleiteten Klasse als ihre Basisklasse
- 8. Drucken abgeleiteten Klassenname in der Basisklasse
- 9. Ändern von abgeleiteten Klassenwerten aus der Basisklasse
- 10. UWP XmlSerializer - Deserialisierung eines Objekts von einer abgeleiteten zur Basisklasse
- 11. C++ Kopie von zwei abgeleiteten Klassen
- 12. Web-Services - XmlInclude in einer abgeleiteten Klasse anstelle einer Basisklasse?
- 13. Call-Funktion von abgeleiteten und Basisklasse
- 14. Überschreiben von Konstanten in abgeleiteten Klassen in C#
- 15. Wie Aufruf Basisklasse Kopierkonstruktor von einer abgeleiteten Klasse Kopierkonstruktor?
- 16. Von der Basisklasse in C#, erhalten abgeleiteten Typ?
- 17. Wie man einen abgeleiteten Klassengliedfunktionszeiger mit einer Basisklasse registriert
- 18. Iterieren durch Objekte mit einer gemeinsamen Basisklasse in unterschiedlichen Speicher
- 19. Wie kann ich dynamisch abgeleitete Klassen von einer Basisklasse erstellen
- 20. Reihenfolge der Initialisierung in abgeleiteten Klassen
- 21. Ausziehbarer ENUM in abgeleiteten Klassen
- 22. WCF DataContract Ausschluss von DataMembers Serialisierung in abgeleiteten Klassen
- 23. C#: Hinzufügen von Erweiterungsmethoden auf eine Basisklasse, so dass sie in abgeleiteten Klassen erscheinen
- 24. nicht geschütztes Mitglied in Basisklasse von abgeleiteten Klasse zugreifen kann
- 25. Basisklasse mit Zeiger des abgeleiteten Typs
- 26. Konflikt in Rückgabetyp von Basisklasse mit abgeleiteten Klasse Auto mit
- 27. Basisklasse auf der Initialisierungsliste einer abgeleiteten Klasse Copy-Konstruktor (C++)
- 28. C++ Zuweisungsoperator = Überladen mit abgeleiteten Klassen
- 29. CRTP beziehen sich in abgeleiteten Klasse von Basisklasse typedef
- 30. C++ wie Methode in abgeleiteten Klasse von Basisklasse aufrufen