Polymorphismus und überladen mit statischen Methoden in C#.
Ich habe versucht, Sie zu erzeugen, ein Werk zurückgeben sollte, ein anderes Objekt, ein " common interface (sagen Item
) nach der input-parameter (ich nenne es einen Zusammenhang) der Funktion getItem(A context)
Nun, angenommen ich definiere einen neuen Typ von Kontext: B
was erbt von A
.
Ich wollte wieder eine andere Sache, je nachdem, ob das übergebene Objekt die factory war Klasse B
oder A
.
Ich versuchte zu tun, wie folgt (überladen die Methode):
class Factory
{
static Item getItem(A context) {...}
static Item getItem(B context) {...}
}
Dies funktioniert gut, wenn ich etwas wie das hier tun:
B bContext=new B();
Item it=Factory.getItem(bContext);
Jedoch, wenn ich die Darsteller und Objekt Typ A
:
A bContext=(A) new B();
Item it=Factory.getItem(bContext);
dem ersten factory-Methode aufgerufen wird.
Dachte ich, dass Polymorphismus wäre sicherzustellen, dass die Ausführung der zweiten Methode, die auch nach der Besetzung, und ich würde gerne wissen, ob ich etwas verpasst?
Ich bin mir bewusst, dass ich Schritt halten konnte, mit einer einzigen Methode, und verwenden Sie die is
- operator, um zu überprüfen, welchen Typ die variable ist, aber ich dachte, die Lösung, die ich oben präsentiert wurde, ein bisschen mehr elegant.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Überladen ist entschieden zu compile-Zeit (abgesehen von der Verwendung der dynamischen Typisierung in C# 4) auf der Grundlage der compile-Zeit-Typ der Argumente - und in Ihrem letzten Schnipsel der compile-Zeit-Typ das argument ist
A
, so ruft esFactory.getItem(A)
.Nur virtuelle Methodenaufrufe sind polymorph (mit überschreiben), wo die eigentliche Ausführung-Zeit-Typ des Ziel-Objekts, um zu entscheiden, welche Implementierung zu nennen. Wenn es Sinn macht, für
A
undB
eine virtuelle Methode (überschriebenB
), die aufgerufen werden können, vonFactory.getItem
zu behandeln, die Unterschiede, das ist toll... ansonsten sind Sie stecken mit entweder dynamische Typisierung oder so etwas wieis
.Können Sie nicht erreichen, was Sie vorgeben, die Art und Weise, die Sie haben, die Dinge bis jetzt.
Einer option ist, um eine gewisse Logik in Ihrer Fabrik Methoden unterscheiden zu können, die den Typ des Arguments. Klobig, nicht schön, aber es funktioniert:
Weitere option ist, um die Kontext-Objekte verantwortlich für das erstellen des Objekts. Zum Beispiel:
Ist und du jetzt tun könnte:
Nicht, wenn Sie Folgendes tun:
ContextB.CreateItem()
aufgerufen werden.