Laden...

Polymorphie anstatt switch verwenden?

Erstellt von sven22 vor 18 Jahren Letzter Beitrag vor 18 Jahren 3.823 Views
S
sven22 Themenstarter:in
154 Beiträge seit 2005
vor 18 Jahren
Polymorphie anstatt switch verwenden?

Hi,

ich lese immer wieder man sollte lieber zur Polymorphie anstatt
Switch Statements greifen. Aber wie ersetze ich nun geschickt einen
String-Vergleich durch Polymorphie?

...

Switch meineVariable {
case "Zeichenkette1":
darstellungZK1(meineVariable);
break;
case "Zeichenkette2":
darstellungZK2(meineVariable);
break;
case "Zeichenkette3":
darstellungZK3(meineVariable);
break;
}
...

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo sven22,

ersetzen durch:

meineVariable.DarstellungZK ();

wobei meineVariable dann natürlich nicht vom Typ String ist, sondern von einem eigenen Oberklassen-Typ. Die drei Unterklassen implementieren dann DarstellungZK entsprechend der jetzigen darstellungZKn.

herbivore

S
sven22 Themenstarter:in
154 Beiträge seit 2005
vor 18 Jahren

ok aber woher was ich denn von welchem typ meineVariable dann ist?
dies muss ich doch wissen, bevor ich sie instanziere?

beispiel:

durch eine benutzeroption erhält man den festzulegenden status erst
während der laufzeit. wie soll ich dass dann machen? mittels einer hashtable
die unterschiedlichen typen auf die jeweilige zeichkette mappen?
<grübel>

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo sven22,

das ist ja gerade der Gag an Polymorphie, dass man nicht wissen muss, welchen Typ das in meineVariable enthaltene Objekt hat.

Die Werte "Zeichenkette1" usw. wurde in deinem Beipspiel ja auch irgendwie der Variablen meineVariable zugewiesen. Stattdessen wird in meinem Beispiel ein Objekt vom entsprechenden Typ zugewiesen.

Siehe auch: http://de.wikipedia.org/wiki/Polymorphie_%28Programmierung%29

herbivore

I
1.739 Beiträge seit 2005
vor 18 Jahren

Polymorphie anstatt Switch? Dein Beispiel arbeitet mit strings..(Umschaltung per value, bei gleichen Datentyp). "ich lese immer wieder man sollte lieber zur Polymorphie anstatt Switch Statements" greifen.
Wo liest du sowas? Was hat a mit b zu tun?(ich denke nichts, dh. ev. schon, nur im anderen Zusammenhang)

>das ist ja gerade der Gag an Polymorphie, dass man nicht wissen muss, welchen
>Typ das in meineVariable enthaltene Objekt hat.

Den Satz habe ich auch nicht verstanden...(Polymorphie ist in OO-Sprachen meist Typsicher)

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo ikaros,

natürlich kann und sollte man nicht jedes switch-Statement durch Polymorphie ersetzen. Ich habe auch überlegt, ob das Beispiel von sven22 zu der einen oder anderen Kategorie gehört. Die bei case verwendeten Werte sprachen dagegen, die Anweisungen im case sprachen dafür.

Den Satz habe ich auch nicht verstanden.

Variablen haben einen statischen und einen dynamischen Typ. Den statischen Typ kennt man und muss ihn auch kennen, um die Variable sinnvoll manipulieren zu können. Aber der dynamische Typ ist aus Benutzungssicht unwichtig. Die Typsicherheit bedeutet ja nur, dass nur bestimmte Typen als dynamische Typen in Betracht kommen, nämlich die Klasse selbst und alle ihre direkten und indirekten Unterklassen.

herbivore

S
sven22 Themenstarter:in
154 Beiträge seit 2005
vor 18 Jahren

Original von herbivore
Die Werte "Zeichenkette1" usw. wurde in deinem Beipspiel ja auch irgendwie der Variablen meineVariable zugewiesen. Stattdessen wird in meinem Beispiel ein Objekt vom entsprechenden Typ zugewiesen.
herbivore

Ah klar 🙂. Wozu den Zustand abfragen wenn man ihn doch direkt bei der Erzeugung
zuweisen kann? Stimmt du hast recht. Folglich würde ich in meinem Beispiel pro sagen wir mal Radiobutton einfach einen anderen Typ des Objekts erzeugen um später dann
meineVariable.DarstellungZK () aufrufen zu können.

@ikaros: ich habe versucht in meinem Zeichekettenbeispiel das Problem zu reduzieren.
Letzlich hat man doch gerade bei der Programmierung eines User-Interfaces häufig eine Variable von einem bestimmten Typ (String,Integer etc) dessen Fallwerte überprüft werden müssen.
Im Nachfolgebeitrag steht deshalb ja ein konkreter Anwendungsfall, wo es durchaus sinnig wäre anstatt mit Switch GUI-Stati abzufragen, die Fälle mit Polymorphie abzudecken.