![]() |
Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass
Zitat:
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. |
Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass
Zitat:
Nachtrag2: :zwinker: 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. |
Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass
Es ist aber eher eine Besonderheit von Delphi, dass man abstrakte Klassen überhaupt instantiieren kann.
|
Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass
So, in meinem Skript hab eich jetzt folgendes stehen:
Zitat:
|
Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass
Zitat:
|
Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass
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. |
Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass
Zitat:
|
Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass
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.
|
Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass
Zitat:
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. |
Re: Sinn, Nutzen und Einsatzmöglichkeit von abstrakten Klass
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:27 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