Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi inherited und die EAbstractError-Exception (https://www.delphipraxis.net/173887-inherited-und-die-eabstracterror-exception.html)

Der schöne Günther 22. Mär 2013 11:10

Delphi-Version: XE2

inherited und die EAbstractError-Exception
 
*Vorhänge zuzieh*

Meine Damen und Herren, ich präsentiere Ihnen ... das dunkle Geheimnis von
Delphi-Quellcode:
inherited
.

Zur Wiederholung zitiere ich zwei bekannte Größen unter Ihnen:

Zitat:

Zitat von himitsu (Beitrag 1146507)
inherited ohne Methodename nutzt automatisch den selben Namen, wie die übergeordnete Methode, inkl. aller Parameter.
Gut für eine überschriebene Methode, mit der selben Parametersignatur und mit den selben Parameterwerten.

Mit Namen wird genau die eine Version verwendet, und man muß Parameter selber übergeben.

Zitat:

Zitat von mkinzler (Beitrag 924863)
Delphi-Quellcode:
inherited;
ruft die identische Methode der Superklasse auf.
Delphi-Quellcode:
inherited Create(AComponent);
ruft fest
Delphi-Quellcode:
Create(AComponent);
auf.


Was mich hierbei nur wundert: Ist die Methode der Oberklasse nun abstrakt - Dann macht ein einfaches
Delphi-Quellcode:
inherited
schlichtweg nichts. Setze ich einen Haltepuntk darauf geht der kaputt - Der Compiler scheint es wohl von sich bereits herauszunehmen.

Rufe ich die abstrakte Methode der Oberklasse über
Delphi-Quellcode:
inherited
jedoch mit ihrem Namen und Parametern auf laufe ich (verständlicherweise) auf einen
Delphi-Quellcode:
EAbstractError
.


Warum diese unterschiedlichen Verhaltensweisen? Gibt es eine Compiler-Direktive mit der ich diese gut gemeinte Hilfe ausschalten kann?

Bummi 22. Mär 2013 11:29

AW: inherited und die EAbstractError-Exception
 
warum willst Du denn eine abstrakte und somit nicht implementierte Methode aufrufen?

Der schöne Günther 22. Mär 2013 11:33

AW: inherited und die EAbstractError-Exception
 
Vielleicht weiß ich ja garnicht, ob meine Oberklasse noch abstrakt ist oder nicht? :?:

sahimba 22. Mär 2013 11:35

AW: inherited und die EAbstractError-Exception
 
Zitat:

Zitat von Bummi (Beitrag 1208403)
warum willst Du denn eine abstrakte und somit nicht implementierte Methode aufrufen?

...weil diese möglicherweise später einmal mit Fleisch gefüllt wird?

sx2008 22. Mär 2013 11:58

AW: inherited und die EAbstractError-Exception
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1208405)
Vielleicht weiß ich ja garnicht, ob meine Oberklasse noch abstrakt ist oder nicht? :?:

Aber der Compiler weiss es und es scheint so zu sein, dass er den Programmierer davor bewahrt eine abstrakte Methode aufzurufen.
Gibt man die Parameter explizit an, "denkt" der Compiler: "ok, er scheint zu wissen was er tut. Also rufe ich den ererbten Kontruktor auf auch wenn er abstrakt ist".

It's not a bug, it's a feature.

uligerhardt 22. Mär 2013 11:59

AW: inherited und die EAbstractError-Exception
 
Zitat:

Zitat von sahimba (Beitrag 1208406)
Zitat:

Zitat von Bummi (Beitrag 1208403)
warum willst Du denn eine abstrakte und somit nicht implementierte Methode aufrufen?

...weil diese möglicherweise später einmal mit Fleisch gefüllt wird?

Genau. Das Verhalten ist ein Fallstrick für die Zukunft.

Bernhard Geyer 22. Mär 2013 12:02

AW: inherited und die EAbstractError-Exception
 
Gibts eigentlich Compilerwarnungen/hinweise?

Der schöne Günther 22. Mär 2013 12:04

AW: inherited und die EAbstractError-Exception
 
Nein.

Ich habe mir sogar die Warnung Konstruierende Instanz enthält abstrakte Methode manuell in einen Compilerfehler verwandelt.

Bummi 22. Mär 2013 12:26

AW: inherited und die EAbstractError-Exception
 
Zitat:

Genau. Das Verhalten ist ein Fallstrick für die Zukunft.
mir ging es nicht darum das inherited zu entfernen (welches ja das gewünschte Verhalten sicherstellt) sondern darum warum man inherited mit parametern aufrufen will.

uligerhardt 22. Mär 2013 12:36

AW: inherited und die EAbstractError-Exception
 
Zitat:

Zitat von Bummi (Beitrag 1208416)
Zitat:

Genau. Das Verhalten ist ein Fallstrick für die Zukunft.
mir ging es nicht darum das inherited zu entfernen (welches ja das gewünschte Verhalten sicherstellt) sondern darum warum man inherited mit parametern aufrufen will.

Das einfache
Delphi-Quellcode:
inherited;
hat für mich den schweren Nachteil, dass man nicht per Strg-Klick zur Implementierung springen kann. Darum schreibe ich möglichst immer die lange Form.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 Uhr.
Seite 1 von 2  1 2      

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