![]() |
Frage: Abstrakte Klasse und Implementierung [OOP]
Warum auch immer ich das tu, aber ich informiere mich freiwillig über
Designmuster und Refactoring von OOP im hohen Schwierigskeitsbereich :) ohne von der Beispielsprache eine Ahnung zu haben, hehe. Aber zum Punkt, ich kappiere bei OOP eigentlich recht viel nur ein Begriff verwirrt mich; Abstrakte Klassen können keine Exemplare haben, jedoch vererbt werden, soweit sogut. Aber der Grund ist ja, dass abstrakte Klassen keine oder sehr relative Implementierung besitzen, wodurch diese portabel werden. Aber was ist in einem solchen Fall eine Implementierung? Ist es die Definition der Schnittstelle? Ist demnach bei einer spezifischen Klasse eine Implementierung sowas wie "Hol mir ein Stück Kuchen" und in einer abstrakten Klasse sowas wie "Hol mir X Stück Kuchen" oder eher noch abstrakter: "X mir Y Stück Z" ? (:D) |
Re: Frage: Abstrakte Klasse und Implementierung [OOP]
In der Regel weiss der Aufrufer einer abstrakten Schnittstelle nicht, wie etwas passiert. Es ist dem Aufrufer auch völlig egal, solange dabei das Erwartete passiert.
Um bei deinem Beispiel zu bleiben: Es kommt darauf an, was der Aufrufer erwartet. Wenn z.B. "etwas zu essen" erwartet wird, würde die Implementierung einer Ableitung von einer abstrakten Klasse in der Tat soetwas wie "X mir Y Stück Z" sein. "X" könnte klaue, kaufe, hole, koche, backe oder sonstwas sein. Das ist dann Sache der Ableitung und nicht des Aufrufers. |
Re: Frage: Abstrakte Klasse und Implementierung [OOP]
In Schlulungen habe ich als Beispiel für abstrakte Klasse gerne das Objekt TThread genommen.
Delphi-Quellcode:
In dem Object TThread ist alles definiert, bis auf die Methode Execute.
{ *************************************************************************** }
{ } { Delphi and Kylix Cross-Platform Visual Component Library } { } { Copyright (c) 1995, 2001 Borland Software Corporation } { } { *************************************************************************** } unit Classes; ... type TThread = class ... protected ... procedure Execute; virtual; abstract; ... end; Beim Ableiten des Threads musst Du eigentlich nur die Methode Execute überschreiben und fertig. Da in Execute ja das drin steht, was derThread für Dich machen soll, macht es natürlich wenig Sinn dies schon im der Basis Klasse zu definieren. Beisp. aus C:\Programme\Borland\Delphi7\Demos\Threads\ThrdDem o.dpr:
Delphi-Quellcode:
Das ist mein Lieblings-Beispiel.
unit SortThds;
... type TSortThread = class(TThread) ... procedure Execute; override; ... end; ... procedure TSortThread.Execute; begin Sort(Slice(FSortArray^, FSize)); end; ... Es zeigt abstrakte Methoden, Threads, Sortieralgos, ... und das ganz einfach, und doch eindrucksvoll ;-) Viel Spaß beim Anschauen und Ausprobieren der Demo App. |
Re: Frage: Abstrakte Klasse und Implementierung [OOP]
Noch ein Beispiel
Delphi-Quellcode:
Entsprechend, was OBJ für eine Klasse ist (TBMW oder TOpel) fährt es anders, kommt ganz auf die Implementierung an :roll:
TAuto = class
... public ... procedure Fahre; virtual; abstract; ... end; TBMW = class (TAuto) ... public ... procedure Fahre; override; ... end; TOpel = class (TAuto) ... public ... procedure Fahre; override; ... end; Darüber braucht man sich aber jetzt keine Gedanken machen, weil BMW und Opel eben Autos sind.
Delphi-Quellcode:
Autos ist ja auch etwas was so nie hergestellt wird, es ist immer eine bestimmt Marke die produziert wird.
TAuto(OBJ).Fahre;
|
Re: Frage: Abstrakte Klasse und Implementierung [OOP]
... und wenn Obj ein Opel ist, dann kommt es in der Funktion fahre zu einem Ausnahmefehler, weil Opel diese Funktion fehlerhaft implementiert hat :mrgreen:
Sorry, aber das musste jetzt sein |
Re: Frage: Abstrakte Klasse und Implementierung [OOP]
Zitat:
Ein etwas besseres Beispiel wäre als Basisklasse "TFahrzeug" und davon abgeleitet "TFahrad", "TAuto", "TLKW" und "TMotorad" mit
Delphi-Quellcode:
kann ich dann jedes Fahrzeug "sicher" fahren.
if obj is TFahrzeug then
begin (obj as TFahrzeug).Fahre; end; Und ein Fahrad färt sich anders als ein LKW :mrgreen: [edit: Fettschrift] |
Re: Frage: Abstrakte Klasse und Implementierung [OOP]
@MaBuSE
Ein BMW fährt sich anders als ein Opel, ist ja auch nur ein Beispiel. So muss man es in meinem Beispiel sehen und so sieht es Sanchez offensichtlich auch :mrgreen: |
Re: Frage: Abstrakte Klasse und Implementierung [OOP]
Zitat:
Also gehört diese Funktionalität auch in die Basisklasse. Wenn ein BMW sich anders verhällt als ein Auto, dann kann man diese Methode ja überschreiben. ;-) Die Kritik war nicht böse gemeint. Aber gemeinsame Funktionalität gehört in die Basis Klasse. Zitat:
|
Re: Frage: Abstrakte Klasse und Implementierung [OOP]
Für die meisten Zeitgenossen wäre es besser sie würden nur Opel fahren, für mich gilt dies jedoch nicht, ich setzte mich gleich in mein Auto (welches <> Opel ist) und mach Feierabend. :mrgreen:
|
Re: Frage: Abstrakte Klasse und Implementierung [OOP]
An eurer Diskussion sieht man ganz nebenbei ein neues Problem, das Vererbung und vor allem abstrakte Klassen mit sich bringen: Wo ziehe ich die Linie? Was ist eine neue Klasse, und was lässt sich besser über Parameter oder Eigenschaften implementieren?
Das soll jetzt keine neue Frage sein, sonder einfach nur zeigen: Mit OOP muss man sich schon im Vorhinein eine Menge mehr Gedanken machen. Zitat:
Vorsicht--ich fahre einen Opel, 93er Baujahr, und der fährt perfekt. Bis auf ein paar kleine Macken. Radio kaputt, Wackelkontakt in den Lautsprechern, Antenne lose, Rückwärtsgang geht manchmal nicht, Riesenloch zwischen 1. und 2. Gang, und letzten Frühling standen 10cm Wasser im Fußraum :kotz: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz