Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Public Variable einer Klasse in Unterklasse verbergen (https://www.delphipraxis.net/187415-public-variable-einer-klasse-unterklasse-verbergen.html)

Jimmie 27. Nov 2015 12:54

Delphi-Version: 5

Public Variable einer Klasse in Unterklasse verbergen
 
Hallo,

Ich habe einen bestehenden Quellcode. Es gibt eine Klasse, die eine globale Variable hat, z.B.:

Code:
type TBase = class
  public
    VarState : integer;
end;
Es gibt einige Unterklassen, die diese Basisklasse ableiten und diese Variable verwenden. Nun möchte ich eine neue Unterklasse erstellen und die globale Variable für die weiteren Unterklassen (der neuen Unterklasse) verbergen, also z.B. die Variable private machen, damit man auf diese in den Unterklassen nicht mehr zugreifen kann. Gibt es da eine Möglichkeit?
Ich kann die Variable nicht einfach durch property ersetzten und die property in der neuen Klasse als private deklarieren, weil die Variable an vielen Stellen beim Funktionsaufruf als var-Parameter übergeben wird.

Der schöne Günther 27. Nov 2015 13:02

AW: Public Variable einer Klasse in Unterklasse verbergen
 
Nein, das widerspricht krass dem Prinzip von Vererbung. Wenn du eine Oberklasse "Tier" hast und eine Integer-Variable "anzahlAugen". Warum willst du dann beim Meerschweinchen plötzlich verbieten, diese Variable abzufragen?

Du kannst es auch nicht verhindern, denn wenn jemand eine Referenz vom Typ "TBase" hat, dann kann das Programm an der Stelle noch nicht einmal wissen dass du die Property/Variable gerne verdecken würdest.

TiGü 27. Nov 2015 13:04

AW: Public Variable einer Klasse in Unterklasse verbergen
 
Ich wüsste nicht wie, aber irgendwie klingt das eher nach einen Kraut-und-Rüben-Klassenkonzept.

Wieviele Unterklassen gibt es von der Basisklasse?
Wieviele Unterklassen kommen noch hinzu?
Wäre es eine Option, die Basisklasse nur als Feld in der neuen Klasse einzuführen?

Delphi-Quellcode:
type
  TBase = class
  public
    VarState: Integer;
  end;

  TYourNewClass = class
  private
    FBase : TBase;
  end;

DeddyH 27. Nov 2015 13:18

AW: Public Variable einer Klasse in Unterklasse verbergen
 
Oder wie an vielen Stellen z.B. in der VCL:
Delphi-Quellcode:
type
  TCustomBase = class
  private
    FVarState: integer;
  protected
    property VarState: integer read FVarState write FVarState;
  end;

  TBase = class(TCustomBase)
  public
    property VarState;
  end;
In den TCustomXXX-Klassen sind die Properties und Methoden noch protected, die abgeleiteten Klassen erhöhen dann die Sichtbarkeit einfach nur noch selektiv.

Lemmy 27. Nov 2015 14:37

AW: Public Variable einer Klasse in Unterklasse verbergen
 
Zitat:

Zitat von DeddyH (Beitrag 1322707)
In den TCustomXXX-Klassen sind die Properties und Methoden noch protected, die abgeleiteten Klassen erhöhen dann die Sichtbarkeit einfach nur noch selektiv.

genau - nur will er halt genau das Gegenteil. und das spricht für ein zumindest fragwürdiges Klassenmodell.

Zitat:

Zitat von TiGü (Beitrag 1322703)
Wäre es eine Option, die Basisklasse nur als Feld in der neuen Klasse einzuführen?

sehe ich auch als einzig sinnvolle Möglichkeit das umzusetzen..

DeddyH 27. Nov 2015 15:05

AW: Public Variable einer Klasse in Unterklasse verbergen
 
Ja eben. Wenn man bestimmte Methoden oder Eigenschaften nicht veröffentlichen will, leitet man dann halt von der Custom-Klasse ab und lässt die Sichtbarkeit, wie sie ist. Das ist auch die einzige saubere Möglichkeit, da man Sichtbarkeiten eben nur erhöhen und nicht erniedrigen kann.

Neutral General 27. Nov 2015 15:24

AW: Public Variable einer Klasse in Unterklasse verbergen
 
Eine weitere Möglichkeit wäre sowas wie:

Delphi-Quellcode:
TBase = class

end;

TVarBase = class(TBase)
  VarState: Integer;
end;
Dann können deine Unterklassen entweder von der Basis mit- oder ohne VarState ableiten.
Deine neue Unterklasse würde dann eben von TBase ableiten, der Rest von TVarBase.


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