Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Frage: Abstrakte Klasse und Implementierung [OOP] (https://www.delphipraxis.net/51204-frage-abstrakte-klasse-und-implementierung-%5Boop%5D.html)

Seikilos 8. Aug 2005 11:01


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)

KrasserChecker 8. Aug 2005 11:11

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.

MaBuSE 8. Aug 2005 12:19

Re: Frage: Abstrakte Klasse und Implementierung [OOP]
 
In Schlulungen habe ich als Beispiel für abstrakte Klasse gerne das Objekt TThread genommen.

Delphi-Quellcode:
{ *************************************************************************** }
{                                                                             }
{ 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;
In dem Object TThread ist alles definiert, bis auf die Methode Execute.
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:
unit SortThds;
...
type
  TSortThread = class(TThread)
...
    procedure Execute; override;
...
  end;
...
procedure TSortThread.Execute;
begin
  Sort(Slice(FSortArray^, FSize));
end;
...
Das ist mein Lieblings-Beispiel.
Es zeigt abstrakte Methoden, Threads, Sortieralgos, ...
und das ganz einfach, und doch eindrucksvoll ;-)

Viel Spaß beim Anschauen und Ausprobieren der Demo App.

Touchdown 8. Aug 2005 12:41

Re: Frage: Abstrakte Klasse und Implementierung [OOP]
 
Noch ein Beispiel

Delphi-Quellcode:
TAuto = class
...
  public
...
    procedure Fahre; virtual; abstract;
...
  end;

TBMW = class (TAuto)
...
  public
...
    procedure Fahre; override;
...
  end;

TOpel = class (TAuto)
...
  public
...
    procedure Fahre; override;
...
  end;
Entsprechend, was OBJ für eine Klasse ist (TBMW oder TOpel) fährt es anders, kommt ganz auf die Implementierung an :roll:

Darüber braucht man sich aber jetzt keine Gedanken machen, weil BMW und Opel eben Autos sind.

Delphi-Quellcode:
TAuto(OBJ).Fahre;
Autos ist ja auch etwas was so nie hergestellt wird, es ist immer eine bestimmt Marke die produziert wird.

Sanchez 8. Aug 2005 12:45

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

MaBuSE 8. Aug 2005 12:48

Re: Frage: Abstrakte Klasse und Implementierung [OOP]
 
Zitat:

Zitat von Touchdown
Noch ein Beispiel
...
Darüber braucht man sich aber jetzt keine Gedanken machen, weil BMW und Opel eben Autos sind.
Delphi-Quellcode:
TAuto(OBJ).Fahre;
Autos ist ja auch etwas was so nie hergestellt wird, es ist immer eine bestimmt Marke die produziert wird.

In diesem Beispiel würde ich aber Fahre im Auto implementieren, da sich die Wagen alle "gleich" fahren.

Ein etwas besseres Beispiel wäre als Basisklasse "TFahrzeug" und davon abgeleitet "TFahrad", "TAuto", "TLKW" und "TMotorad"

mit
Delphi-Quellcode:
if obj is TFahrzeug then
begin
  (obj as TFahrzeug).Fahre;
end;
kann ich dann jedes Fahrzeug "sicher" fahren.

Und ein Fahrad färt sich anders als ein LKW :mrgreen:

[edit: Fettschrift]

Touchdown 8. Aug 2005 14:37

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:

MaBuSE 8. Aug 2005 14:50

Re: Frage: Abstrakte Klasse und Implementierung [OOP]
 
Zitat:

Zitat von Touchdown
@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:

Ist schon klar, aber es gibt in (fast) allen Autos Gas Pedal, Bremse, Lenkrad, Kuplung (bzw. Automatik), Scheinwerfer (wenn dunkel), ... . Diese Fahrfunktionalität ist in allen Autos gleich.
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:

Zitat von Touchdown
@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:

Das bedeutet, Du darfst mit Deinem Führerschein nur Opel fahren, da Du in der Fahrschule im Opel unterwegs warst?

Touchdown 8. Aug 2005 15:37

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:

tigerman33 8. Aug 2005 16:19

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:

Zitat von sanchez
... und wenn Obj ein Opel ist, dann kommt es in der Funktion fahre zu einem Ausnahmefehler, weil Opel diese Funktion fehlerhaft implementiert hat Mr. Green

@sanchez:
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 20:55 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz