Ich stoße auf Probleme mit der Möglichkeit, Funktionen / Eigenschaften aufzurufen, die für die Kindklasse einzigartig sind. Ich frage mich, ob es eine Möglichkeit gibt, etwas Ähnliches wie das folgende zu tun:
%Vor%In diesem rudimentären Beispiel hätte ich also eine Liste von Kreaturen und müsste in der Lage sein, die Mana-Eigenschaft einer gegebenen magischen Kreatur aufzurufen.
Wie du sicherlich in anderen Antworten gesehen hast, kannst du wie folgt auf die Eigenschaft Mana
von magischen Kreaturen zugreifen:
Da wir bereits über Polymorphismus sprechen, sollten Sie wissen, dass if (x is SomeType) { .. }
ein Code-Geruch sein kann. Nehmen wir an, Sie haben tatsächlich eine foreach
-Schleife für die Verarbeitung all Ihrer Kreaturen. Es könnte dann besser sein, eine virtuelle Methode in der Basisklasse zu erstellen und alles, was Sie tun, innerhalb der foreach
-Schleife in dieser virtuellen Methode auszuführen. Sie würden dann die Methode in Ihrer Magical
-Klasse überschreiben und dadurch die if
-Anweisung loswerden.
Machen wir ein Beispiel. Sagen wir, alle deine Kreaturen werden getroffen und verlieren Energie. Normale Kreaturen verlieren Gesundheitspunkte, während magische Kreaturen Mana verlieren:
%Vor% Ihre ursprüngliche foreach
-Schleife wird jetzt viel einfacher:
Ich möchte Ihnen zu diesem Thema eine sehr schöne Präsentation empfehlen: Bedingungen und Polymorphismus .
Also, in diesem rudimentären Beispiel hätte ich eine Liste von Kreaturen und müsste in der Lage sein, die Mana-Eigenschaft einer gegebenen magischen Kreatur aufzurufen.
Ja, das ist möglich. Verwenden Sie Enumerable.OfType<T>
:
Sie müssen an diesem Punkt eine Umwandlung in "Magisch" vornehmen. Zum Beispiel:
%Vor%Wenn eine Eigenschaft für die untergeordnete Klasse eindeutig ist, müssen Sie sie in die untergeordnete Klasse umwandeln, um auf die Eigenschaft zuzugreifen, z. B.
%Vor%Oder alternativ mit LINQ:
%Vor%Es macht keinen Sinn, etwas zu tun wie:
%Vor%Weil deine Kreatur vielleicht kein Magisches ist und deshalb kein Mana haben würde.
Polymorphismus kommt, wo Sie zwei verschiedene Dinge mit den gleichen Eigenschaften haben.
%Vor%AttackValue ist sowohl Kreatur als auch Magisch gemeinsam, so dass du es ohne Sorge verwenden kannst, egal ob es eine Kreatur oder eine Magische ist. Und die beiden könnten völlig unterschiedliche Implementierungen von AttackValue haben - es ist Ihnen egal, weil Sie sie polymorph behandeln.
Die Vererbung funktioniert nur in einer Richtung; Alle Kindklassen sind ihre Eltern, aber kein Elternteil ist ihr Kind.
Um zu bekommen, was du willst, musst du wissen, dass die Klasse, die du als Kreatur behandelst, tatsächlich eine Magische ist. Sie können dies testen mit:
%Vor%Wenn es machbar ist, könntest du eine nicht-reflektierende Möglichkeit bieten, dies zu entdecken, indem du etwas in Kreatur deklarierst, das in Magisch spezifiziert werden muss:
%Vor%Sobald du weißt, dass die Kreatur ein Magisches ist, kannst du die Instanz als ihre Unterklasse behandeln, indem du folgendes formulierst:
%Vor%Tags und Links c# polymorphism