AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Frage: Abstrakte Klasse und Implementierung [OOP]
Thema durchsuchen
Ansicht
Themen-Optionen

Frage: Abstrakte Klasse und Implementierung [OOP]

Ein Thema von Seikilos · begonnen am 8. Aug 2005 · letzter Beitrag vom 9. Aug 2005
Antwort Antwort
Seite 1 von 2  1 2      
Seikilos

Registriert seit: 18. Mär 2003
71 Beiträge
 
#1

Frage: Abstrakte Klasse und Implementierung [OOP]

  Alt 8. Aug 2005, 12:01
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" ? ()
Noch nix mit Signatur
  Mit Zitat antworten Zitat
KrasserChecker

Registriert seit: 21. Jul 2004
120 Beiträge
 
#2

Re: Frage: Abstrakte Klasse und Implementierung [OOP]

  Alt 8. Aug 2005, 12:11
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.
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

Re: Frage: Abstrakte Klasse und Implementierung [OOP]

  Alt 8. Aug 2005, 13:19
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.
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Touchdown

Registriert seit: 17. Feb 2003
227 Beiträge
 
#4

Re: Frage: Abstrakte Klasse und Implementierung [OOP]

  Alt 8. Aug 2005, 13:41
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

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

TAuto(OBJ).Fahre; Autos ist ja auch etwas was so nie hergestellt wird, es ist immer eine bestimmt Marke die produziert wird.
function getallfornothing: TGoldesel;
begin
result := TGoldesel.create;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#5

Re: Frage: Abstrakte Klasse und Implementierung [OOP]

  Alt 8. Aug 2005, 13:45
... und wenn Obj ein Opel ist, dann kommt es in der Funktion fahre zu einem Ausnahmefehler, weil Opel diese Funktion fehlerhaft implementiert hat

Sorry, aber das musste jetzt sein
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

Re: Frage: Abstrakte Klasse und Implementierung [OOP]

  Alt 8. Aug 2005, 13:48
Zitat von Touchdown:
Noch ein Beispiel
...
Darüber braucht man sich aber jetzt keine Gedanken machen, weil BMW und Opel eben Autos sind.
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

[edit: Fettschrift]
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Touchdown

Registriert seit: 17. Feb 2003
227 Beiträge
 
#7

Re: Frage: Abstrakte Klasse und Implementierung [OOP]

  Alt 8. Aug 2005, 15:37
@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
function getallfornothing: TGoldesel;
begin
result := TGoldesel.create;
end;
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

Re: Frage: Abstrakte Klasse und Implementierung [OOP]

  Alt 8. Aug 2005, 15:50
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
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 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
Das bedeutet, Du darfst mit Deinem Führerschein nur Opel fahren, da Du in der Fahrschule im Opel unterwegs warst?
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Touchdown

Registriert seit: 17. Feb 2003
227 Beiträge
 
#9

Re: Frage: Abstrakte Klasse und Implementierung [OOP]

  Alt 8. Aug 2005, 16:37
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.
function getallfornothing: TGoldesel;
begin
result := TGoldesel.create;
end;
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#10

Re: Frage: Abstrakte Klasse und Implementierung [OOP]

  Alt 8. Aug 2005, 17:19
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 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
Christian
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:16 Uhr.
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