none
Vererbung - Aufruf überladener Methoden mit verschiedenen abgeleiteten Klassen als Parameter RRS feed

  • 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
    Donnerstag, 22. Juli 2010 14:23

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);

    Donnerstag, 22. Juli 2010 14:53

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);

    Donnerstag, 22. Juli 2010 14:53
  • Danke GreatVolk, Die Variante mit Reflection und Invoke war recht einfach zu implementieren und funktioniert. CU, Christian
    Donnerstag, 22. Juli 2010 15:32