|
|
||||||
|
#1
|
|
|
|
|
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
|
|
|
|
|
"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
|
|
|
|
|
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
|
|
|
|
|
Hallo,
was sind Abstrakte Klassen? wofür braucht man die? Grüzi Jens |
|
#5
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
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
|