Kann protected Methode nicht überschreiben

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Kann protected Methode nicht überschreiben

Beitrag von braunbär »

Hallo!
Ich stehe wieder einmal auf dem Schlauch.
TInifile hat eine protected Methode ReadIniValues.
Ich möchte von TInifile eine Klasse TfdInifile ableiten, und dort unter anderem Readinivalues überschreiben.

Angehängt ist die Fehlermeldung, die ich bekomme.
tfdinifile.JPG
tfdinifile.JPG (90.4 KiB) 1401 mal betrachtet
Die entsprechende Stelle der Deklaration in der Klasse TIniFles:

Code: Alles auswählen

 TIniFile = class(TCustomIniFile)
  Private
    FStream: TStream;
    FCacheUpdates: Boolean;
    FDirty : Boolean;
    FWriteBOM: Boolean;
    procedure FillSectionList(AStrings: TStrings);
    Procedure DeleteSection(ASection : TIniFileSection);
    Procedure MaybeDeleteSection(ASection : TIniFileSection);
    procedure SetCacheUpdates(const AValue: Boolean);
    procedure SetWriteBOM(const aWriteBOM: Boolean);
  protected
    procedure ReadIniValues;
    procedure MaybeUpdateFile;
...    
 
Eine protected Methode kann man doch in einer abgeleiteten Klasse überschreiben?

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Kann protected Methode nicht überschreiben

Beitrag von Sieben »

Du kannst sie nur überschreiben (override), wenn sie virtual deklariert wurde. Ansonsten kannst du sie nur ersetzen durch eine gleichnamige, in der du aber auch inherited aufrufen kannst. Nachteil der solchermaßen ersetzten: du musst die Klasse, in der sie ersetzt wurde immer explizit auch als diese ansprechen. Das sollte im vorliegenden Fall aber eigentlich kein Problem sein.
Zuletzt geändert von Sieben am Do 29. Okt 2020, 18:38, insgesamt 1-mal geändert.

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: Kann protected Methode nicht überschreiben

Beitrag von braunbär »

Danke!

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Kann protected Methode nicht überschreiben

Beitrag von Sieben »

Du kannst übrigens eine statische Methode wie ReadIniValues in deinem Ableger dann deinerseits durchaus als 'virtual' redeklarieren, was zB nützlich ist, wenn du noch weiter ableiten willst.

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Kann protected Methode nicht überschreiben

Beitrag von PascalDragon »

Sieben hat geschrieben:
Do 29. Okt 2020, 18:41
Du kannst übrigens eine statische Methode wie ReadIniValues in deinem Ableger dann deinerseits durchaus als 'virtual' redeklarieren, was zB nützlich ist, wenn du noch weiter ableiten willst.
Wobei man hinzufügen muss, dass dies nicht das Verhalten von TIniFile selbst ändern wird. Wenn dessen Code also ReadIniValues aufruft, wird es weiterhin stur TIniFile.ReadIniValues aufrufen und nicht irgendeine Methode in einer Kindklasse.
FPC Compiler Entwickler

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Kann protected Methode nicht überschreiben

Beitrag von Sieben »

Ja, das hatte ich oben ja auch schon geschrieben, vielleicht nicht ganz so deutlich. Bei einer TIniFile bzw deren Ablegern sollte das aber weniger ein Problem sein, da sie ja meist eh nur 'punktuell' als eben die Klasse, die man gerade braucht, erzeugt und verwendet werden. Was anderes ist es mit Klassen, die ausgiebig in Bibliotheken oder anderen Klassen verwendet werden, prominentes Beispiel TStrings.

Wenn man aber in eigenen Ableitungen frühzeitig 'virtualisiert', dann schafft man wiederum die Voraussetzung dafür, in eigenen Bibliotheken oder Klassen nur die eigene Basisklasse ansprechen zu müssen und trotzdem die jeweils 'klassengerechte' Methode aufzurufen.

Antworten