Benutzer mit den meisten Antworten
Vererbung - Aufruf überladener Methoden mit verschiedenen abgeleiteten Klassen als Parameter

Frage
-
Hallo,
// folgende Klassen Struktur ist gegeben:
public class QSM_Var // Basis Klasse
{
public string Name;
// Methoden
}
public class QSM_Var_String : QSM_Var // Abgeleitete Klasse
{
public string Value
// Methoden
}
public class QSM_Var_Int : QSM_Var // Abgeleitete Klasse
{
public int Value
// Methoden
}
// Weitere abgeleitete Klassen folgen
// In einer anderen Klasse gibt es eine überladene Methode:
public static class AndereKlasse
{
public void MachWas(QSM_Var input)
{ /* code für Basis Klasse*/ }
public void MachWas(QSM_Var_String input)
{ /* code für 1. abgeleitete Klasse*/ }
public void MachWas(QSM_Var_int input)
{ /* code für 2. abgeleitete Klasse*/ }
// etc, pp.
}
// Variable vom Typ der Basis-Klasse, enthält Objekte der
// abgeleiteten Klassen
public QSM_Var MyVar = new QSM_Var_Int();
// Methodenaufruf:
AndereKlasse.MachWas(MyVar);
######### End of Code #######
Mein Problem ist, dass immer nur die Methode mit dem Parameter vom Typ
der Basisklasse aufgerufen wird, weil die Variable MyVar von diesem Typ
ist. Auch, wenn sie ein Objekt der abgeleiteten Klasse enthält (Was für
ein Objekt da gerade drin ist, wird zur Laufzeit entschieden).
Ich könnte mein Problem folgendermaßen lösen:
if (MyVar.GetType() == typeof(QSM_Var_String){
AndereKlasse.MachWas((QSM_Var_String)MyVar)
}
if (MyVar.GetType() == typeof(QSM_Var_Int){
AndereKlasse.MachWas((QSM_Var_Int)MyVar)
}
// und so weiter
Das würde wohl funktionieren, wäre aber Spaghetti-Code und und nicht
besonders wartungsfreundlich. Gibt es eine elegantere Methode?
TIA,
Christian
Antworten
-
Nein.
Welche Funktion "MachWas" aufgerufen wird, wird zu Compile-Zeit entschieden, und nicht zur Laufzeit. Wenn es sich nicht nur um 2 Klassen handelt, sondern um Hunderte, dann könntest du in Erwägung ziehen, dir mit Reflection die richtige Methode geben zu lassen und diese dann per Invoke aufzurufen. (Dafür must du dann einen kleinen Performanceverlust in Kauf nehmen)
var mi = AndereKlasse.GetType().GetMethod("MachWas", <InsertTypeInformationHere>);
mi.Invoke(object, MyVar);
- Als Antwort markiert Christian Treffler Donnerstag, 22. Juli 2010 15:30
Alle Antworten
-
Nein.
Welche Funktion "MachWas" aufgerufen wird, wird zu Compile-Zeit entschieden, und nicht zur Laufzeit. Wenn es sich nicht nur um 2 Klassen handelt, sondern um Hunderte, dann könntest du in Erwägung ziehen, dir mit Reflection die richtige Methode geben zu lassen und diese dann per Invoke aufzurufen. (Dafür must du dann einen kleinen Performanceverlust in Kauf nehmen)
var mi = AndereKlasse.GetType().GetMethod("MachWas", <InsertTypeInformationHere>);
mi.Invoke(object, MyVar);
- Als Antwort markiert Christian Treffler Donnerstag, 22. Juli 2010 15:30