C # Polymorphismus - Zugreifen auf Eigenschaften der untergeordneten Klasse, die nicht im übergeordneten Objekt enthalten sind

8

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.

    
DivinusVox 31.01.2011, 18:07
quelle

8 Antworten

18

Die kurze Antwort:

Wie du sicherlich in anderen Antworten gesehen hast, kannst du wie folgt auf die Eigenschaft Mana von magischen Kreaturen zugreifen:

%Vor%

Einen Schritt weiter gehen:

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:

%Vor%

Ich möchte Ihnen zu diesem Thema eine sehr schöne Präsentation empfehlen: Bedingungen und Polymorphismus .

    
stakx 31.01.2011, 18:23
quelle
11
  

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> :

%Vor%     
jason 31.01.2011 18:11
quelle
5

Sie müssen an diesem Punkt eine Umwandlung in "Magisch" vornehmen. Zum Beispiel:

%Vor%     
Reed Copsey 31.01.2011 18:11
quelle
1

In diesem speziellen Beispiel müsstest du nur die Kreatur als Magisch wirken und dann deine Funktion aufrufen. Sie würden dann etwas tun wie:

%Vor%     
Victor 31.01.2011 18:12
quelle
1
%Vor%     
Kris Ivanov 31.01.2011 18:12
quelle
0

das sollte die Arbeit machen:

%Vor%     
Kolja 31.01.2011 18:10
quelle
0

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.

    
MrKWatkins 31.01.2011 18:15
quelle
-1

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%     
KeithS 31.01.2011 18:18
quelle

Tags und Links