hilpers


  hilpers > comp.lang.* > comp.lang.delphi.misc

 #1  
08.02.2010, 09:50
Peter Schütt
Hallo,
nach 10 Jahren mache ich wieder beruflich ein bißchen Delphi. :-)

Und da bin ich direkt auf etwas gestoßen: Gibt es eigentlich abstrakte
Klassen in Delphi?

Es gibt Klassen mit abstrakten Methoden, aber man kann diese Klassen,
wenn ich das richtig in Erinnerung habe, instanziieren und man bekommt
zur Laufzeit (natürlich) eine Exception, wenn man die abstrakte
Methode aufruft.

Kann man eine Klasse so abstrakt definieren, daß man sie gar nicht
instanziieren kann?

Ciao
Peter Schütt
 #2  
08.02.2010, 10:18
Matthias Eissing
"Peter Schütt" <peprpg> schrieb
> Kann man eine Klasse so abstrakt definieren, daß man sie gar nicht
> instanziieren kann?


[url down]

class abstract

Classes, and not just methods, can be declared as abstract.


type
TAbstractClass = class abstract
procedure SomeProcedure;
end;
 #3  
08.02.2010, 14:39
Michael Winter
Peter Schütt wrote:

> Es gibt Klassen mit abstrakten Methoden, aber man kann diese Klassen,
> wenn ich das richtig in Erinnerung habe, instanziieren und man bekommt
> zur Laufzeit (natürlich) eine Exception, wenn man die abstrakte
> Methode aufruft.
>
> Kann man eine Klasse so abstrakt definieren, daß man sie gar nicht
> instanziieren kann?


In D7 liefert der Compiler nur eine Warnung an dieser Stelle.

-Michael
 #4  
08.02.2010, 19:58
Jens Kallup
Hallo,

was sind Abstrakte Klassen?
wofür braucht man die?

Grüzi
Jens
 #5  
08.02.2010, 20:33
Holger Lembke
Jens Kallup <jkallup> wrote:

>was sind Abstrakte Klassen?
>wofür braucht man die?


"oben" Prototypen einbauen, die später erst mit Leben gefüllt werden.

tfahrzeug = class(object)
procedure fahren; abstract;
end;

baut ein Fahrzeug, das schon mal fahren kann. Und alle Methoden in
tfahrzeug können schon "fahren" aufrufen.

tdreirad = class(tfahrzeug)
procedure fahren; override;
end;

dient dann zum Konkretisieren, wie "fahren" tatsächlich funktioniert.

Könnte man natürlich auch mit einer leeren Methode machen, hat den
schlichten Vorteil, dass die der Compiler oder Laufzeitumgebung meckern,
wenn man auf abstrakte Methoden zugreift. Könnte man natürlich auch anders
lösen...
 #6  
09.02.2010, 02:51
Hans-Peter Diettrich
Michael Winter schrieb:

> In D7 liefert der Compiler nur eine Warnung an dieser Stelle.


In Delphi hat sich in den letzten Jahren einiges getan. D7 funktioniert
zwar immer noch, aber eben nicht mit den ganzen neuen Features.

Wenn Du den Anschluß halten willst, solltest Du mal ein Upgrade ins Auge
fassen. Allerdings dürfte die Upgrade-Frist inzwischen gerade abgelaufen
sein (Ende Januar) :-(

BTW, für D7 Benutzer empfiehlt sich der Umstieg AFAIR auf D2007, die
letzte Ansi-Version. Ab D2009 muß man alle alten Projekte auf Unicode
umstellen, was sich meist nur lohnt, wenn die Verwendung von Unicode in
diesen Projekten wirklich Vorteile bringt.

DoDi
 #7  
09.02.2010, 02:56
Hans-Peter Diettrich
Jens Kallup schrieb:

> was sind Abstrakte Klassen?
> wofür braucht man die?


Man braucht sie nicht, genauer gesagt: man kann sie nicht gebrauchen ;-)

Sie sind nur dazu da, daß der Compiler gleich meckert, wenn man
versehentlich eine Instanz so einer Klasse erzeugen will. Abstrakte
Klassen gab es schon lange, z.B. TStrings, und der Compiler hat auch da
schon gemeckert, wenn er gemerkt hat, daß eine Instanz so einer Klasse
mit abstrakten Methoden erzeugt werden soll.

DoDi
 #8  
09.02.2010, 06:22
Andreas Mosmann
Jens Kallup schrieb am 08.02.2010 in
<4b707aea$0$9750$6e1ede2f>:

> Hallo,


> was sind Abstrakte Klassen?
> wofür braucht man die?

Sie sind ein Bestandteil von Objektorientierter Programmierung.
Ziel OOP ist ja, im Idealfall alle Gemeinsamkeiten verschiedener Klassen
in einer Superklasse zusammenzufassen und dann die Funktionalität nur
noch in dieser Klasse zu verdrahten und alle anderen von dieser erben zu
lassen.
Bei diesem Prozess kann es natürlich dazu kommen, dass diese Superklasse
selbst eben nicht mehr sinnvoll einzeln verwendbar ist. Und in einem
solchen Fall kann man das durch "abstract" kennzeichnen, dann weiß auch
der Compiler, dass es sinnlos (und damit verboten) ist, eine Instanz
dieser Klasse anzulegen.

Beispiel:

Objekt Mensch
- Name
- Geburtsdatum
- Masse

Objekt Raumschiff
- Baujahr
- Masse
- Kosten

==>

abstraktes Objekt IrgendwasMitEinerMasse
- Masse

Objekt Raumschiff (Objekt IrgendwasMitEinerMasse)
- Baujahr
- Kosten

Objekt Mensch (Objekt IrgendwasMitEinerMasse)
- Name
- Geburtsdatum

Soviel zur Theorie. In Delphi ist es nicht möglich, von mehreren Klassen
zu erben, das kann man letzlich nur über Interfaces realisieren. Es wird
deshalb eher seltener vorkommen, dass man abstrahiert, bis zum Erbrechen
und man wird vergleichsweise oft Klassen bauen, die auch eigenständig
leben können. Aber man soll ja nie nie sagen :)

Ein klassisches Beispiel sind geometrische Objekte, die einen
gemeinsamen Vorfahren haben, in dem die Operation "Verschieben" als
"Löschen, Position ändern, Zeichnen" implementiert ist. Nachfolgende
Klassen erben diese Funktionalität, aber die Basisvariante weiss ja noch
nicht einmal, wie sie sich selbst zeichnen oder löschen soll. Daher kann
sie auch nicht instanziiert werden.
 #9  
10.02.2010, 04:57
Michael Winter
Hans-Peter Diettrich wrote:

> In Delphi hat sich in den letzten Jahren einiges getan. D7 funktioniert
> zwar immer noch, aber eben nicht mit den ganzen neuen Features.
>
> Wenn Du den Anschluß halten willst, solltest Du mal ein Upgrade ins Auge
> fassen.


Keine Bange, das habe ich gemacht. Auf VS2008.

D7 wird zur Pflege des Altbestandes verwendet und für das kleine Tool
zwischendurch. Dafür reicht es vollkommen aus.

-Michael
 #10  
10.02.2010, 07:20
Andreas Mosmann
Michael Winter schrieb am 10.02.2010 in
<7tf06qFo54U1>:

> Hans-Peter Diettrich wrote:


>> In Delphi hat sich in den letzten Jahren einiges getan. D7 funktioniert
>> zwar immer noch, aber eben nicht mit den ganzen neuen Features.
>>
>> Wenn Du den Anschluß halten willst, solltest Du mal ein Upgrade ins Auge
>> fassen.


> Keine Bange, das habe ich gemacht. Auf VS2008.


> D7 wird zur Pflege des Altbestandes verwendet und für das kleine Tool
> zwischendurch. Dafür reicht es vollkommen aus.


> -Michael

Gibts dafür jetzt eigentlich ein Delphi Plugin?
SCNR
Ähnliche Themen
Wieso darf eine abstrakte Attribut-Klasse nicht generisch sein?

Hallo, weiß jemand ob die, in meinen Augen künstliche, Beschränkung C# spezifisch ist, oder von der CLR nicht unterstützt werden würde? Solange eine nicht-abstrakte...

Abstrakte Klasse - Desturktor

Hallo, Ich habe diese abstrakte Klasse: class Widget { protected: int positionX; int positionY; ...

WebRequest abstrakte Klasse?

[..] hier lese ich, System.Net.WebRequest ist abstrakt, man muss die abgeleiteten Klassen benutzen (z.b. System.Net.HttpWebRequest ). Dann finde ich aber einen...

Interface = komplett abstrakte Klasse?

Hi, ich grübel schon seit einer Weile, ob man ein Interface in Java, einfach als komplett abstrakte Klasse bezeichnen kann, die lediglich Medthoden-Signaturen enthält, oder...


Alle Zeitangaben in WEZ. Es ist jetzt 03:37 Uhr. | Privacy Policy