AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language W1009: Redeklaration verbirgt ein Mitglied in der Basisklasse
Thema durchsuchen
Ansicht
Themen-Optionen

W1009: Redeklaration verbirgt ein Mitglied in der Basisklasse

Ein Thema von hoika · begonnen am 30. Dez 2010 · letzter Beitrag vom 30. Dez 2010
Antwort Antwort
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#1

W1009: Redeklaration verbirgt ein Mitglied in der Basisklasse

  Alt 30. Dez 2010, 14:23
Delphi-Version: 5
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
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

AW: W1009: Redeklaration verbirgt ein Mitglied in der Basisklasse

  Alt 30. Dez 2010, 15:41
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: W1009: Redeklaration verbirgt ein Mitglied in der Basisklasse

  Alt 30. Dez 2010, 15:46
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: W1009: Redeklaration verbirgt ein Mitglied in der Basisklasse

  Alt 30. Dez 2010, 15:52
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
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.015 Beiträge
 
Delphi 12 Athens
 
#5

AW: W1009: Redeklaration verbirgt ein Mitglied in der Basisklasse

  Alt 30. Dez 2010, 16:09
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: W1009: Redeklaration verbirgt ein Mitglied in der Basisklasse

  Alt 30. Dez 2010, 18:03
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
Heiko
  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 21:57 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