Vererbung - Aufruf überladener Methoden mit verschiedenen abgeleiteten Klassen

22/07/2010 - 12:04 von Christian Treffler | Report spam
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 folgendermasse 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
 

Lesen sie die antworten

#1 Ozan Ayyüce
22/07/2010 - 21:58 | Warnen spam
Christian Treffler :

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



Double dispatch - geht leider nicht mit Standard C#. Einige Leute
haben damit mal experimentiert:
http://jbazuzicode.blogspot.com/200...-in-c.html
Unter dem Stichwort findest Du sehr vieles zu dem Thema.

Zunàchst solltest du sicher sein, dass MachWas nicht doch als
virtuelle Methode von QSM_Var implementiert werden kann. Sonst kannst
du dir eine Hilfsklasse basteln, die von QSM_var in einer virtuellen
Factory-function zurückgegeben wird.

Als ganz andere Möglichkeit kannst du auch das Visitor-pattern
implementieren:
http://sourcemaking.com/design_patterns/visitor


Ozan

Ähnliche fragen