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
 
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
6.118 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
 


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 15:42 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