![]() |
Delphi-Version: 10.2 Tokyo
Instanz von T wird mit der abstrakten Methode XYZ angelegt
Hallo!
Ich bekomme ein paar Compilerwarnungen der Art
Code:
Das ist soweit nicht dramatisch, weil die betreffende Klasse diese Methoden tatsächlich nicht benötigt. Mich würde aber interessieren ob es eine elegantere Möglichkeit gibt, diese Compilerwarnung zu beseitigen als leere Dummy-Prozeduren in den implementation-Abschnitt zu schreiben.
Instanz von T wird mit der abstrakten Methode XYZ angelegt
Grüße Cody |
AW: Instanz von T wird mit der abstrakten Methode XYZ angelegt
Zitat:
|
AW: Instanz von T wird mit der abstrakten Methode XYZ angelegt
Vor und nach dem Create per Compiler-Befehl die Warnung deaktivieren?
Aber wer sagt dir jetzt, dass in Zukunft diese Methode nicht doch irgendwann mal versucht wird aufzurufen? |
AW: Instanz von T wird mit der abstrakten Methode XYZ angelegt
Zitat:
Zitat:
|
AW: Instanz von T wird mit der abstrakten Methode XYZ angelegt
Noch besser nicht Basisklasse, sondern erst in der Hierarchie, wenn benötigt
|
AW: Instanz von T wird mit der abstrakten Methode XYZ angelegt
Das ist richtig, im konkreten Fall jedoch etwas unpraktikabel, weil es ein Delphi Starter ist. Ich müsste weiter oben in der Hierarchie schon abzweigen und dann jede Menge nachimplementieren. Da ist es deutlich einfacher und sicherer, einfach leere Prozeduren anzulegen. Im ungünstigsten Fall passiert dann einfach gar nichts, aber es kracht nicht mit einer Abstract Exception. Da es sich bei den bisher abstraktion Methoden um Functions handelt, gebe ich einfach den Defaultwert zurück, auf den ich dann in der Routine prüfen kann, wo dynamisch die eine oder andere Kindklasse verwendet wird.
|
AW: Instanz von T wird mit der abstrakten Methode XYZ angelegt
Wenn du sicher bist, daß die Methoden nur in überschreibenden Klassen verwendet werden, kannst du auch in der Dummy-Methode eine Assertion einbauen oder eine
Delphi-Quellcode:
-Exception werfen. Dann bekommst du wenigstens mit, wenn sich am Aufrufverhalten ungewollt etwas ändert.
EAbstractError
|
AW: Instanz von T wird mit der abstrakten Methode XYZ angelegt
Da hast du völlig recht Uwe. Die Idee finde ich sogar sehr gut, in der Basisklasse eine Art von Not-Implemented-Benachrichtigung einzubauen. Irgendwie finde ich es schade, dass es neben den protected- und public-Abschnitten in Klassen nicht auch einen gibt wo man Methoden deklarieren kann, die ausschließlich in Kindklassen angesprochen/überschrieben werden können und deren Sichtbarkeit nach außen hin in Kindklassen nicht erhöht werden kann. Also ungefähr sowas:
Delphi-Quellcode:
Damit könnte man von vornherein ausschließen, dass solche Methoden nach außen hin sichtbar werden. Ein Konstrukt aus protected Methode + final trifft das irgendwie nicht so richtig. Das Statement "obligatory" würde die Implementierung einer Methode in Kindklassen erzwingen - "abstract" lässt es ja offen und im Zweifel kracht es.
type
TMyBaseClass = class(TObject) private protected descendend procedure MyMethod; virtual; obligatory; public end; TMyChildClass = class(TMyBaseClass) descended procedure MyMethod; override; // <-- Klappt end; TMyChildClass2 = class(TMyBaseClass) public procedure MyMethod; override; // <-- Compilerfehler wegen erhöhter Sichtbarkeit end; TMyChildClass3 = class(TMyBaseClass) descendend // MyMethod wird nicht implementiert, Compilerfehler end; |
AW: Instanz von T wird mit der abstrakten Methode XYZ angelegt
Zitat:
Delphi-Quellcode:
.
strict protected
|
AW: Instanz von T wird mit der abstrakten Methode XYZ angelegt
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 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