Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   W1009: Redeklaration verbirgt ein Mitglied in der Basisklasse (https://www.delphipraxis.net/157120-w1009-redeklaration-verbirgt-ein-mitglied-der-basisklasse.html)

hoika 30. Dez 2010 14:23

Delphi-Version: 5

W1009: Redeklaration verbirgt ein Mitglied in der Basisklasse
 
Hallo #,

ich erweitere eine Klasse Base.
Dazu habe ich eine neue Klasse von Base abgeleitet.
Ein Property muss in meiner Ableitung aber einen anderen Datentyp haben,
geht leider nicht anderes.

type
Base = class;
property FontName: AnsiString;
end;

type
Sub = class(Base)
property FontName: Integer;
end;

Warnung W1009 wird angezeigt.

Schreibe ich das jetzt so

type
Sub = class(Base)
{$WARNINGS OFF}
property FontName: Integer;
{$WARNINGS ON}
end;

ist die Warnung weg.

In der OH steht:
Die Direktive $WARNINGS kann nur für ganze Prozeduren oder Funktionen verwendet werden. Die Angabe von $WARNINGS ist nicht bei Anweisungsblöcken in einer Prozedur oder Funktion möglich.


Was gilt denn jetzt für Properties ?.



Noch ein Hinweis:
Ich soll einen Wrapper für einfaches Benutzen zweier völlig verschiedener Klassen (Druck, PDF-Export) bauen,
ohne dass Code bei deren Benutzung geändert werden soll.
Die Druckklasse definiert ein property FontName als Integer, die andere als String.

Daran kann ich aber nichts ändern.



Heiko

sx2008 30. Dez 2010 15:41

AW: W1009: Redeklaration verbirgt ein Mitglied in der Basisklasse
 
Zitat:

Zitat von hoika (Beitrag 1071229)
Ich soll einen Wrapper für einfaches Benutzen zweier völlig verschiedener Klassen (Druck, PDF-Export) bauen,
ohne dass Code bei deren Benutzung geändert werden soll.
Die Druckklasse definiert ein property FontName als Integer, die andere als String.

Daran kann ich aber nichts ändern.

Das wäre dann also das Entwurfsmuster Adapter.
Das Problem ist nun dass ein Integer, der auf einen Fontnamen verweisst eben nun mal kein FontName ist.
Richtig wäre hier zwei verschiedene Properties einzuführen, die sich gegenseitig beeinflussen:
Delphi-Quellcode:
TAdapterBase = class
public
  property FontIndex:Integer read GetFontIndex write SetFontIndex;
  property FontName:string read FFontName write FFontName;
end;
Über die Funktionen SetFontIndex und GetFontIndex wird nun versucht, einem Index einen Namen zuzuweisen (verlustfrei möglich) und einem Namen einen Index zuzuweisen (nicht immer möglich).
Man benötigt dazu eine kleine Tabelle für die Umwandlung:
Delphi-Quellcode:
TFontIndexRecord = record
  Name:string;
  Index:integer;
end;
const
FontIndexArray:array[0..3] of TFontIndexRecord = (
(Name:'Arial';Index:0),
(Name:'Courier New';Index:1),
...
);
Die Basisklasse speichert immer nur den FontName, weil dieser allgemeiner als der FontIndex ist.

himitsu 30. Dez 2010 15:46

AW: W1009: Redeklaration verbirgt ein Mitglied in der Basisklasse
 
Zitat:

ohne dass Code bei deren Benutzung geändert werden soll.
Die inkompatiblen Typen Integer und String wiedersprechen dem aber, da so dennoch was umgebaut werden muß, wenn man die Klassen austauscht.

Abgesehn davon, daß derartige "Verdeckungen" fehleranfällig sind.

hoika 30. Dez 2010 15:52

AW: W1009: Redeklaration verbirgt ein Mitglied in der Basisklasse
 
Hallo,

nehme ich einen Adapter, muss ich sämtliche Methoden dort noch einmal definieren.
Es handelt sich hier übrigens um QuickPDF die haben ein "paar" Methoden.

Das in FontName kein Integer gespeichert werden soll, ist schon klar,
kann ich aber nicht ändern.

Im Code steht XX.FontName:= 1;

Dieses XX (die alte Druck-Komponente) will ich jetzt über QuickPDF nachbauen.

type
Sub = class(TQuickPDF)
end;

Dummerweise hat das TQuickDF ebenfalls ein FontName, der AnsiString ist.



Heiko

Uwe Raabe 30. Dez 2010 16:09

AW: W1009: Redeklaration verbirgt ein Mitglied in der Basisklasse
 
Geht's auf diese Art?

Delphi-Quellcode:
type
  TBase = class
  private
    FFontName: string;
  public
    property FontName: string read FFontName write FFontName;
  end;

  TDerived = class(TBase)
  private
    function FontNameFromIndex(Value: Integer): string;
    function GetFontName: Integer;
    function GetIndexOfFontName(const Value: string): Integer;
    procedure SetFontName(const Value: Integer);
  public
    property FontName: Integer read GetFontName write SetFontName;
  end;

function TDerived.FontNameFromIndex(Value: Integer): string;
begin
  Result := '';
  { TODO : mapping Index -> FontName }
end;

function TDerived.GetFontName: Integer;
begin
  Result := GetIndexOfFontName(inherited FontName);
end;

function TDerived.GetIndexOfFontName(const Value: string): Integer;
begin
  Result := -1;
  { TODO : mapping FontName -> index }
end;

procedure TDerived.SetFontName(const Value: Integer);
begin
  inherited FontName := FontNameFromIndex(Value);
end;

hoika 30. Dez 2010 18:03

AW: W1009: Redeklaration verbirgt ein Mitglied in der Basisklasse
 
Hallo,

kann ich gerade nicht prüfen,
weil ZU HAUSE ;)

Aber ich denke, die Warnung wird immer noch erzeugt.

Ich hatte ja eher nach sowas wie reintroduce für Properties gesucht.


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:25 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