Hallo,
Zitat von
alzaimar:
Merke: Auch ein Prozeduraufruf ist eine Form der Kommunikation.
Mir ist nicht klar, wer bei einem Prozeduraufruf kommuniziert?
Objekte haben eine Identität und können entsprechend Nachrichten empfangen und senden.
Beispielhaft soll eine beliebige Liste als string ausgegeben werden.
Objektorientiert kann man sich vorstellen, dass alle Objekte in der Liste die Nachricht 'AsString' verarbeiten können (die Liste selbst auch).
Delphi-Quellcode:
5 AsString == '5';
'Test' AsString == 'Test';
ACar AsString == 'Opel Kadett';
with AList do begin
Add(5);
Add('Test');
Add(ACar);
end;
AList AsString == '(''5''; ''Test''; ''Opel Kadett'')'
Prozedural sähe das ganze so ähnlich aus:
Delphi-Quellcode:
AsString(5) == '5';
AsString('Test') == 'Test';
AsString(ACar) == 'Opel Kadett';
AddNumberToList(AList,5);
AddStringToList(AList,'Test');
AddCarToList(AList,ACar);
AsString(AList) == '(''5''; ''Test''; ''Opel Kadett'')'
Der Unterschied ist der Zeitpunkt, zu dem bestimmt werden kann, welcher Code ausgeführt wird, um den String zu erzeugen. Prozedural geschieht dies mit Hilfe früher Bindung, also zur Compilezeit. Das heisst, es muss eine Prozedur für jeden Variablentyp existieren, der in einen String umgewandelt werden kann. In
AsString(AList)
würde über die Liste iteriert, geprüft werden, was für ein Element drin ist und die richtige Prozedur aufgerufen. Wenn plötzlich auch Flugzeuge als String ausgegeben werden sollen, dann muss
AsString(APlane)
implementiert werden, und die Prozedur zur Ausgabe der Liste angepasst werden.
Objektorientiert würde der Empfänger der Nachricht (APlane) entscheiden was zu tun ist. Alle anderen können sich darauf verlassen, dass das Objekt sich selbst am besten damit auskennt, was es selbst zu tun hat und müssen lediglich die Nachricht AsString kommunizieren. Erst zur Laufzeit wird durch den Empfänger der Nachricht bestimmt, was konkret geschieht.
Freilich kann dies auch mit Delphi so implemetiert werden, allerdings nicht prozedural, sondern objektorientiert. Hat ja niemand gesagt, dass das nicht unterstützt wird.
Gruß
Sebastian