AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klassen
Thema durchsuchen
Ansicht
Themen-Optionen

Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klassen

Ein Thema von Luckie · begonnen am 1. Okt 2008 · letzter Beitrag vom 2. Okt 2008
Antwort Antwort
Seite 3 von 4     123 4      
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
 
#21

Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass

  Alt 1. Okt 2008, 17:57
Zitat von Luckie:
Zitat von p80286:
Ich denke man könnte die abstrakte Klasse als Prototypen bezeichnen.
Ich galube, das ist eine gute Zusammenfassung.
Du kannst eine abstrakte Funtkion aber auch als "forward"-Definition ansehen.

Du hast eine Klasse TKörper, in dieser Klasse kannst Du das Gewicht berechnen in dem Du das Volumen mit dem spezifischem Gewicht des Körpers multipizierst. (Vorausgesetzt alle Körper bestehen nur aus einem Material). Der Körper weiß aber nicht wie sein Volumen berechnet wird. Ein TWürfel und eine TKugel unterscheiden sich in der Volumenberechnung.

Ich hoffe es wird Dir in folgendem Beispiel klar.

Ein anderes gutes Beispiel findest du auf Deiner Festplatte im Delphi Demos Ordner (ThreadDemo).

[edit]
Nachtrag:
Beim Kompilieren gibt es "nur" eine Warnung wenn Du abstrakte Methoden nicht implementierst.
Du kannst eine TKoerper erzeugen aber wenn Du berechneGewicht aufrufst, bekommst du beim berechneVolumen Aufruf eine EAbstractError-Exception.
[/edit]

Beispiel:
Delphi-Quellcode:
unit Unit2;

interface

type
  TKoerper = class
  private
    FspezifischesGewicht: Integer;
  public
    function berechneVolumen: Integer; virtual; abstract;
    function berechneGewicht: Integer;
    property spezifischesGewicht: Integer read FspezifischesGewicht write FspezifischesGewicht;
  end;

  TWuerfel = class(TKoerper)
  private
    FLaenge: Integer;
  public
    property Laenge: Integer read FLaenge write FLaenge;
    function berechneVolumen: Integer; override;
  end;

implementation

{ TKoerper }

function TKoerper.berechneGewicht: Integer;
begin
  Result := berechneVolumen * FspezifischesGewicht;
end;


{ TWuerfel }

function TWuerfel.berechneVolumen: Integer;
begin
  Result := FLaenge * FLaenge * FLaenge;
end;

end.
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#22

Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass

  Alt 2. Okt 2008, 08:14
Zitat von MaBuSE:
Nachtrag:
Beim Kompilieren gibt es "nur" eine Warnung wenn Du abstrakte Methoden nicht implementierst.
Du kannst eine TKoerper erzeugen aber wenn Du berechneGewicht aufrufst, bekommst du beim berechneVolumen Aufruf eine EAbstractError-Exception.
Und in .NET geht das sogar soweit dass sich das Projekt gar nicht erst kompilieren lässt (also keine Warning sondern ein Error). Das geht sogar soweit, dass sobald eine abstrakte Methode in deiner Klasse definiert ist, du gezwungen wirst die gesamte Klasse als abstract du deklarieren. Und das führt dazu, dass noch nicht mal eine Instanz der Klasse direkt erstellt werden kann.

Nachtrag2:
Abstrakte Methoden machen auch dann Sinn, wenn in der Basisklasse noch überhaupt nicht bekannt ist, wie die Methode implementiert werden soll. Um das Beispiel von Mabuse nochmals aufzugreifen, kann man in der abstrakten Klasse zwar erahnen, was das BerechneVolumen einer TKörper Klasse machen soll, aber weil die Geometrie in diesem Stadium noch nicht bekannt ist, kann hier nichts vorgegeben werden. Allerdings das Gewicht des Körpers ist wieder über die generelle Formel Volumen*Volumenmasse definiert, und zwar für alle Körper. Die Methode BerechneGewicht kann also direkt in der Basisklasse komplett implementiert werden. Das konkrete Volumen wird dann aus einer Methode der abgeleiteten Klasse genommen.

Du kannst dir natürlich auch vorstellen, dass in der BerechneVolumen eventuell einige generelle Aktionen getroffen werden müssen. In dem Fall deklarierst du wie gehabt die Methode als virtual und in der abgeleiteten Klasse als override.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#23

Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass

  Alt 2. Okt 2008, 11:15
Es ist aber eher eine Besonderheit von Delphi, dass man abstrakte Klassen überhaupt instantiieren kann.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#24

Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass

  Alt 2. Okt 2008, 11:29
So, in meinem Skript hab eich jetzt folgendes stehen:
Zitat:
\subsection{Warum abstrakte Klassen?}
Abstrakte Klassen stellen einen Prototypen\index{Prototyp} oder eine Basiklasse\index{Basisklasse} dar, worauf die abgeleiteten Klassen dann aufbauen. Durch abstrakte Methoden\index{Methode!abstrakt} wird den abgeleiteten Klassen mitgeteilt, welche Methoden sie noch selber implementieren muss. Abstrakte Methoden sind dann sinnvoll, wenn abgeleitete Klassen identische Eigenschaften haben, die sich aber unterschiedlich verhalten. So haben geometrische Figuren die gemeinsame Eigenschaft \emph{Fläche}. Die Berechnung der Fläche hängt jedoch von der geometrischen Figur ab. In der Basisklasse wird die Methode zur Berechnung der Fläche als abstrakt deklariert, da sie nicht sinnvoll implementiert werden kann, da sich die Fläche der unterschiedlichen geometrischen Körper auch unterschiedlich errechnet.

Abstrakte Klassen kann man nicht instanzieren in Java, da sie Methoden besitzen, die nicht implementiert sind und somit ohne Funktion. Solch eine Klasse mit leeren Metrhoden zu instanzieren, wäre nicht sinnvoll. Ist eine Methode der Klasse abstrakt gekennzeichnet, so muss die ganze Klasse als abstrakt gekennzeichnet werden.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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
 
#25

Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass

  Alt 2. Okt 2008, 13:05
Zitat von Luckie:
So, in meinem Skript hab eich jetzt folgendes stehen:
Zitat:
\subsection{Warum abstrakte Klassen?}
Abstrakte Klassen stellen einen Prototypen\index{Prototyp} oder eine Basiklasse\index{Basisklasse} dar, worauf die abgeleiteten Klassen dann aufbauen. Durch abstrakte Methoden\index{Methode!abstrakt} wird den abgeleiteten Klassen mitgeteilt, welche Methoden sie noch selber implementieren muss. Abstrakte Methoden sind dann sinnvoll, wenn abgeleitete Klassen identische Eigenschaften haben, die sich aber unterschiedlich verhalten. So haben geometrische Figuren die gemeinsame Eigenschaft \emph{Fläche}. Die Berechnung der Fläche hängt jedoch von der geometrischen Figur ab. In der Basisklasse wird die Methode zur Berechnung der Fläche als abstrakt deklariert, da sie nicht sinnvoll implementiert werden kann, da sich die Fläche der unterschiedlichen geometrischen Körper auch unterschiedlich errechnet.
Ich würde noch erwähnen, das in der Basisklasse auch auf die abstrakten Funktionen zugegriffen werden kann, um Funktionalität in die Basisklasse zu packen, die für alle abgeleiteten Klassen identisch ist, aber Funktionen aufruft, in denen sich die abgeleiteten Klassen unterscheiden.
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#26

Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass

  Alt 2. Okt 2008, 13:23
Also abstrakte Klassen kenne ich mehr aus Java und nicht aus Delphi

Wenn ich zB. eine Klasse "Spielfigur" habe hat diese eine Methode "walk".
Die Spielfiguren selbst sind jetzt jedoch keine "Spielfigur"en sondern zB "Pferd","Hund" etc
Die akstrakte Klasse dient im Gegensatz zum Interface jetzt dazu das die davon ageleitete Klasse bereits eine funktionierende Methode hat. Beim interface muss ich die erst bei jeder abgeleiteten Klasse selbst schreiben.

Abstrakt macht man das ganze damit man diese Klassen nicht direkt erzeugen kann, sondern erst ableiten muss.
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#27

Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass

  Alt 2. Okt 2008, 13:24
Zitat von Angel4585:
Also abstrakte Klassen kenne ich mehr aus Java und nicht aus Delphi
TStrings ist eine abstrakte Klasse auf der alle Stringlisten basieren.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#28

Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass

  Alt 2. Okt 2008, 13:27
Streng genommen nein, denn TStrings hat zwar abstrakte Methoden, ist aber nicht selbst als abstrakt deklariert. Das geht auch erst in späteren Delphi-Versionen.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#29

Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass

  Alt 2. Okt 2008, 13:51
Zitat von Angel4585:
Die akstrakte Klasse dient im Gegensatz zum Interface jetzt dazu das die davon ageleitete Klasse bereits eine funktionierende Methode hat. Beim interface muss ich die erst bei jeder abgeleiteten Klasse selbst schreiben.
Das ist bei abstrakten Klassen auch nicht anders. Wenn die Basisklasse bereits eine funktionierende Methode besitzt, dann ist diese ja nicht mehr abstrakt, sondern virtuell und kann in der abgeleiteten Klasse überschrieben werden.

Interfaces haben noch teils ganz anderen Nutzen, denn man kann Instanzen von Klassen, die ein Interface implementieren, direkt über das Interface ansprechen. Wenn das Objetk zum Beispiel von einem Remoting Server kommt, dann braucht der Client noch nicht einmal zu wissen, um welche Klasse es sich handelt. Die Definition des interface reicht ihm völlig aus... Bei abstrakten Klassen ist sowas nicht zu bewerkstelligen... Aber Thema ist ja abstrakte Klassen und nicht Interfaces.
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#30

Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass

  Alt 2. Okt 2008, 14:17
Ja aber es war ja nicht die Frage nach dem Sinn der Interfaces, sondern der abstrakten Klassen.

Luckie: Ich weis das es abstrakte Klassen in Delphi gibt, es ist nur nicht so offensichtlich wenn man nicht so oft damit arbeitet. Bei Java hab ich das öfters gemacht,deswegen war es mir dort geläufiger.
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 11:17 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