Autor Beitrag
mmgg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Di 15.07.14 22:15 
In diesem Buch wird die Polymorphy gut beschrieben,
openbook.galileocomp...3e-94b9-86cd3538acfb
trotzdem, eine Stelle macht mich konfuse.
In diesem Kapitel "4.4 Polymorphie" Abschnitt "4.4.2 Abstrakte Methoden" wird Polymorphie beschrieben als
"Die Fähigkeit, auf einer Basisklassenreferenz die typspezifische Methode aufzurufen", soweit klar. Nur, dieser Abschnitt kommt so. als wäre es nur das.
Denn weiter unten dann im Abschnitt: " Polymorphes Überschreiben einer virtuellen Methode",
wird Polymorphie beschrieben als, kurz gefasst, etwas was man hat, wenn eine Methode in einer Subklasse überschreiben wird:
"Möchte die ableitende Klasse die geerbte Methode neu implementieren und soll die Methode polymorphes Verhalten zeigen, muss die überschreibende Methode mit dem Modifizierer override signiert werden"
Er zeigt es dann auch mit diesem Beispiel.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
public class Flugzeug : Luftfahrzeug {
  public override void Starten() {
    Console.WriteLine("Das Flugzeug startet.");
  }
}

Also ist auch das Polymorphie? Polymorphie ist also, Aufruf von Methode(X) auf eine Basisklassenreferenz, aber auch Auruf von Methode(X) in einer Subclass?

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 15.07.14 22:41 
Polymorphie ist nur möglich, wenn
(a) eine Methode der Basisklasse als abstract oder virtual deklariert ist
und
(b) eine abgeleitete Klasse diese Methode mit override überschreibt.

Ist das gegeben, wird die Methode der tatsächlich instanzierten Klasse aufgerufen und nicht die der deklarierten Klasse (im Buch Basisklassenreferenz genannt).


Die beiden Dinge, die Du oben zitiert hast, sind dann eigentlich zwei Seiten der selben Medaille. Denn es kann ja nur dann eine typspezifische Methode aufgerufen werden, wenn auch eine typspezifische Implementierung existiert.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
mmgg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Mi 16.07.14 02:25 
Angenommen ich bin Schüler, hab das gerade verdaut und komm zu dem Abschnitt "4.5.2 Überladen einer Basisklassenmethode "
Was hält mich davon ab zu sagen, dass ich polymorphes Verhalten auch dann hab, wenn ich eine Methode einer Subclass überlade?
Das Beispiel mit dem Array wird dann nicht functionieren, am Ende bleibt aber, auch mit einem simplen overload erreiche ich unterschiedliches Verhalten.
Polymorphy will eben das ermöglichen, unterschiedliches verhalten.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 16.07.14 07:37 
user profile iconmmgg hat folgendes geschrieben Zum zitierten Posting springen:
Angenommen ich bin Schüler, hab das gerade verdaut und komm zu dem Abschnitt "4.5.2 Überladen einer Basisklassenmethode "
Was hält mich davon ab zu sagen, dass ich polymorphes Verhalten auch dann hab, wenn ich eine Methode einer Subclass überlade?

Nichts hält Dich davon ab, das macht es aber nicht richtiger. Ich verstehe die Relevanz der Frage nicht :nixweiss:

user profile iconmmgg hat folgendes geschrieben Zum zitierten Posting springen:
Das Beispiel mit dem Array wird dann nicht functionieren, am Ende bleibt aber, auch mit einem simplen overload erreiche ich unterschiedliches Verhalten.
Polymorphy will eben das ermöglichen, unterschiedliches verhalten.
Nein, was Polymorphie ist, hast Du selber zitiert und das ist nicht einfach nur "unterschiedliches Verhalten", sondern "unterschiedliches Verhalten bei identischer Deklaration". Der Unterschied entsteht erst bei der Instanzierung.
Und ein Overload ist was ganz anderes, nämlich der Aufruf mit verschiedenen Parametern, das hat mit Polymorhpie aber nix zu tun.


Wenn ich folgendes tue (entsprechend dem Buch):
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Luftfahrzeug lft;


lft = new Flugzeug();
lft.Starten();


lft = new Hubschrauber();
lft.Starten();


Dann bekomme ich durch Polymorphie (Methode "Starten" ist in Klasse "Luftfahrzeug" als abstract deklariert und wird in den beiden Kindklassen mittels "override" überschrieben) zwei unterschiedliche Ausgaben, obwohl ein identischer Aufruf an die identisch deklarierte Variable (Basisklassenreferenz) geht. Der Unterschied kommt erst dadurch, dass ich unterschiedliche Kindklassen instanziert habe. Und dieses Verhalten (Polymorphie) bekommst Du mit Überladung nicht hin.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 16.07.14 11:13 
Zitat:
Und ein Overload ist was ganz anderes, nämlich der Aufruf mit verschiedenen Parametern, das hat mit Polymorhpie aber nix zu tun.


Das läuft leider dummerweise in der Fachliteratur auch oft unter Polymorphie. Stichwort Adhoc-Polymorphie. Überladen(overload) und Überschreiben(override) sind sich zwar sprachlich unglücklicherweise sehr ähnlich würde die aber immer dem Begriff Polymorph vorziehen. Da steckt einfach zuviel dahinter.
mmgg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Mi 16.07.14 21:11 
Warum erzählt Ihr mir was von Paramtern, warum folgert Ihr so?
Wenn das unterschiedliche Verhalten, das ich auch mit overload nun mal erreiche, nicht zur Polymorphie dazugezählt wird, dann nehm ich das so hin.

Es bleibt immer noch die Frage ob Polymorphie 'nur' :
"Die Fähigkeit, auf einer Basisklassenreferenz die typspezifische Methode aufzurufen" ist,
oder (wie der Autor im Buch weiter unten schreibt) "Möchte die ableitende Klasse die geerbte Methode neu implementieren und soll die Methode polymorphes Verhalten zeigen, muss die überschreibende Methode mit dem Modifizierer override signiert werden"
Das Codebeispiel, dass dann folgt, gibt mir Polymorphie, so wie mit dem Arraybeispiel beschrieben(aufruf Basisklassenreferenz).
Der Author schreibt dann aber auch: "dass der Modifizierer override grundsätzlich immer Polymorphie signalisiert. "
Er schreibt "signalisiert", das mag nach Wortklauberei aussehen, wenn ich mich damit aufhalte, aber, - "signalisiert"- kann man nun mal so auslegen, dass hier nur gemeint ist: sollte Methode über Basisklassenreferenz aufgerufen werden, ist Polymorphie da . und nur das ist mit Polymorphie gemeint?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 16.07.14 21:55 
Polymorphie ist mehr eine philosophisches Ding, eine Idee, etwas abstraktes jedenfalls nichts scharf definiertes oder eine konkret in der OO angewendete Technik. Je nachdem wenn du fragst wirst du unterschiedliche antworten bekommen was da alles zugehört und was nicht. Das Einzige auf das sich wohl alle einigen können was definitiv zur Polymorphie gehört ist das überschreiben (override) von Methoden. Alles andere wird mal und mal nicht zur Polymorphie gezählt (aka Methoden Überladung, Generics, Templates u.s.w.). Insofern würde ich dir raten den Begriff möglichst nicht zu verwenden sondern im Sprachgebrauch immer die konkreten Techniken zu benennen dann kann man sich nicht missverstehen.

Auf dein Buchzitat angesprochen würde ich sagen ja was der Author da beschreibt ist Polymorphie aber das nur das Polymorphie ist würde ich persönlich verneinen. Ich hätte mir gewünscht das er denn Begriff erst gar nicht einführt.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 17.07.14 10:21 
Hallo,

ich finde schon, daß man den Begriff Polymorphie in diesem Zusammenhang kennen sollte. Daß es verschiedene Arten von Polymorphie gibt, zeigt aber auch gut der Wiki-Artikel: Polymorphie (Programmierung).

Und für C# (also bei der Objektorientierten Programmierung) hat Christian es in seinen Beiträgen gut zusammenfassend erklärt.
mmgg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41



BeitragVerfasst: Sa 19.07.14 02:57 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
..., hat Christian es in seinen Beiträgen gut zusammenfassend erklärt.

Nein, hat er nicht! Er hat nur wiederholt was schon in meiner Eingangsfrage als Polymorphie beschrieben ist.
Er beutete diese Frage für sich aus, sowas kann auch nach hinten losgehen.
Übrigens Overload wird in manchen Sprachen als kleiner Bruder der Poly. genannt.
Es ist eben nicht etwas VÖLLIG anderes!

Und wenn es unter C# nicht so ist, dann haben die 'Erfinder' das eben so festgelegt , festgelegt dass dies nicht unter diesen Begriff gezogen wird.

@Ralf
dass sich innerhalb einer Sprache, nicht finden lässt was dazugehört und nicht, kann ich mir nur schwer vorstellen.

@All
Wenn ich einer von denen wäre die davon Ahnung haben, dann hätte ich diese Frage etwa so beantw.
Polymorphi ist sowohl blabla als auch bla bla.
Oder eben nur das. (bezogen auf C#)
Ende.