Wie rufe ich eine Unterklasse die Methode auf eine baseclass Objekt?

Ich bin mit einer Bibliothek, generiert eine Reihe von Klassen für mich.

Diese Klassen Erben alle von einer gemeinsamen Basisklasse aber, dass die Basisklasse nicht definiert ein paar Methoden, die für alle Unterklassen.

Beispiel:

SubClassA : BaseClass{
  void Add(ItemA item) {...}
  ItemA CreateNewItem() {...}
}

SubClassB: BaseClass{
  void Add(ItemB item) {...}
  ItemB CreateNewItem() {...}
}

Leider ist die Basisklasse nicht diese Methoden. Das wäre toll:

BaseClass{
  //these aren't actually here, I'm just showing what's missing:
  abstract void Add(ItemBaseClass item);  //not present!
  abstract ItemBaseClass CreateNewItem(); //not present!
}

Da gibt es eine gemeinsame Basisklasse für meinen A+B-Objekte und eine gemeinsame Basisklasse für die Item-Objekte, ich hatte gehofft, Sie zu nutzen-aus der wunderbaren Welt des Polymorphismus.

Leider, da die gängigen Methoden nicht tatsächlich in der base-Klasse, ich kann Sie nicht anrufen praktisch. z.B., das wäre perfekt:

BaseClass Obj;
Obj = GetWorkUnit(); //could be SubClassA or SubClassB

ItemBaseClass Item = Obj.CreateNewItem(); //Compile Fail: CreateNewItem() isn't in the base class

Item.DoSomething();

Obj.Add(Item); //Compile Fail: Add(...) isn't in the base class

Offensichtlich casting funktionieren würde, aber dann würd ich brauchen zu wissen, welche Art ich hatte, die würde negieren die Vorteile.

Wie kann ich die "Kraft" ein Aufruf dieser Methoden? Ich bin nicht besorgt über immer ein Objekt, das nicht implementieren die Methode, die ich bin versucht zu rufen. Ich kann eigentlich machen was ich will in VB--ich nicht bekommen, intellisense, aber der compiler ist zufrieden und es funktioniert:

CType(Obj, Object).Add(Item) //Note: I'm using C#--NOT VB

Gegen, ich habe keine Kontrolle über diese Klassen (was ich denke Regeln, partielle Klassen).

Was ist falsch mit Ihrer eigenen Methode dann? Verwenden Sie nur mir, wenn Sie Option Strict On
Sie haben die Kontrolle über die Unterklasse? Wenn Sie dies tun, gehen Sie mit Lucero Lösung.
Haren: C# nicht Option Strict an alle. Meine Lösung funktioniert, wenn Sie keine Kontrolle über die Klassen, Lucero ' s Lösung ist am besten, wenn Sie die Kontrolle über die Unterklassen.

InformationsquelleAutor Michael Haren | 2009-04-16

Schreibe einen Kommentar