AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Kann ich eine abstrakte Klasse ohne Warnung erstellen?
Thema durchsuchen
Ansicht
Themen-Optionen

Kann ich eine abstrakte Klasse ohne Warnung erstellen?

Ein Thema von Der schöne Günther · begonnen am 2. Dez 2020 · letzter Beitrag vom 2. Dez 2020
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Kann ich eine abstrakte Klasse ohne Warnung erstellen?

  Alt 2. Dez 2020, 07:06
Delphi-Version: 10.4 Sydney
Ich erstelle eine Unterklasse von einem System.IniFiles.TCustomIniFile mit seinen zwei Dutzend virtual abstract Methoden.

Ich gehe nun nicht hin und implementiere für jede Methode ein override sondern erstelle mir einmal einen System.Rtti.TVirtualMethodInterceptor und intercepte einfach alle meine virtuellen Methoden. Das klappt super.

Problem: Dort wo ich nun eine Instanz meiner Klasse erstelle erhalte ich, nicht ganz unberechtigt, eine Warnung
Code:
[dcc32 Warning] Project1.dpr(26): W1020 Constructing instance of 'TTest' containing abstract method 'TBase.SomeMethod'
.

Die Warnung zeigt auf jede Zeile welche das Create aufruft, nicht auf die Klasse selbst. Ich kann mir also auch nicht helfen wenn ich die Warnung dort abschalte.

Wie komme ich hier wieder raus?

Ich gebe am besten das konkrete Beispiel:

interface
Delphi-Quellcode:
uses
  System.SysUtils,
  System.Rtti,
  System.IniFiles;

type
   TDelegateIni = class(TCustomIniFile)
   protected var
      delegate: TCustomIniFile;
      interceptor: TVirtualMethodInterceptor;
   public
      constructor Create(const delegate: TCustomIniFile);
      destructor Destroy(); override;
   end;

implementation
Delphi-Quellcode:
constructor TDelegateIni.Create(const delegate: TCustomIniFile);
begin
   inherited Create(String.Empty);
   self.delegate := delegate;
   interceptor := TVirtualMethodInterceptor.Create(ClassType);
   interceptor.OnBefore :=
      procedure(
         Instance: TObject;
         Method: TRttiMethod;
         const Args: TArray<TValue>;
         out DoInvoke: Boolean;
         out Result: TValue
      )
      begin
         DoInvoke := False; // all methods are virtual abstract
         Result := Method.Invoke(delegate, Args);
      end;
   interceptor.Proxify(self);
end;

destructor TDelegateIni.Destroy();
begin
   if Assigned(interceptor) then
      begin
         interceptor.Unproxify(self);
         interceptor.Destroy();
      end;
    delegate.Free();

   inherited;
end;
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.349 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Kann ich eine abstrakte Klasse ohne Warnung erstellen?

  Alt 2. Dez 2020, 07:32
Das wirst du nicht ändern können. Solche Tricks haben eben auch Nachteile.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.147 Beiträge
 
Delphi 12 Athens
 
#3

AW: Kann ich eine abstrakte Klasse ohne Warnung erstellen?

  Alt 2. Dez 2020, 18:19
Jupp, von TCustomIniFile einen Nachfahren und dann dort alle abstrakten Methoden "leer" Implementieren,
dann bekommst keine Warnungen mehr und du kannst dich in Ruhe mit dem Interceptor drangängen.
Oder es gleich richtig implementieren, denn der Interceptor ist saulangsam.

Man kann zwar diese Warnung abschalten (wenn man zu dem Fehlercode die Hilfe lesen würde),
{$WARN CONSTRUCTING_ABSTRACT OFF} ... {$WARN CONSTRUCTING_ABSTRACT DEFAULT}
obwohl ich sie viel lieber von Warnung auf Fehler umstellen würde,
{$WARN CONSTRUCTING_ABSTRACT ERROR}
denn wer sowas abstraktes abstruses macht, der gehört eigentlich richtig doll verhauen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 2. Dez 2020 um 18:24 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 Uhr.
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