![]() |
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:
|
AW: Instanz von T wird mit der abstrakten Methode XYZ angelegt
Zitat:
|
AW: Instanz von T wird mit der abstrakten Methode XYZ angelegt
Hmmm womit wir wieder beim abstract wären :-D Aber ich meine mich zu erinnern, dass das früher bei D7 von Haus aus so war, dass der Compiler abgebrochen hat wenn Abstracts nicht implementiert waren. Mit dem strict protected bin ich aber schon mal ein gutes Stück weiter beim ordentlichen Anwendungsdesign.
|
AW: Instanz von T wird mit der abstrakten Methode XYZ angelegt
Zitat:
Delphi-Quellcode:
Modifier (bin ich auch erst drüber gestoßen, nachdem ich schon Jahrelang mit Delphi gearbeitet habe). Habe mir angewöhnt immer
strict
Delphi-Quellcode:
und
strict private
Delphi-Quellcode:
zu verwenden, wenn ich die Felder/Methoden tatsächlich nur intern verwende. Mann nimmt ja auch unter z.B. Java nicht standardmäßig überall die
strict protected
Delphi-Quellcode:
-Privacy.
package
|
AW: Instanz von T wird mit der abstrakten Methode XYZ angelegt
Was in dem Zusammenhang fehlt, (meiner Meinung nach) ist das Konzept der friendklassen wie in C++
Dann muss man nicht unbedingt alles public machen was von einer unterstützenden Klasse benötigt wird. Kleinere Unitfiles, bessere Wartbarkeit Zitat:
|
AW: Instanz von T wird mit der abstrakten Methode XYZ angelegt
Bei Delphi sind alle innerhalb einer Unit "Freunde"
|
AW: Instanz von T wird mit der abstrakten Methode XYZ angelegt
Zitat:
Delphi-Quellcode:
zu deklarieren - was noch unschöner ist.
public
Aber gut, das wird denke ich etwas OT jetzt :stupid: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:49 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