Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ReadOnly auf TList (https://www.delphipraxis.net/69228-readonly-auf-tlist.html)

Andreas H. 12. Mai 2006 07:17


ReadOnly auf TList
 
Hallo,

wie kann ich eigentlich in einer selbsterstellten Klasse den Zugriff auf die darin enthaltene Ableitung von TList auf lesenden Zugriff beschränken?
Die Liste sollte nur durch die Klasse änderbar sein, externer Code soll aber lesend auf die Liste zugreifen können?
Irgendwie stehe ich auf dem Schlauch. :gruebel:

Gruß Andreas

SirThornberry 12. Mai 2006 07:25

Re: ReadOnly auf TList
 
hast du von TList abgeleitet oder TList im private?
Wenn du TList im Private wäre es damit getan das du nur Methoden zum lesen implementierst. wie hast du es denn derzeit umgesetzt - kannst du eventuell etwas quelltext posten?

Der_Unwissende 12. Mai 2006 07:38

Re: ReadOnly auf TList
 
Hi,
du kannst einfach eine Eigenschaft Items in deiner Ableitung einführen, mit dieser gleichen Bennenung verdeckst du das alte Property und kannst auch nur lesend (nach aussen) den Zugriff ermöglichen.
Schöner ist denke ich dennoch der Weg, den SirThornberry anspricht, einfach einen Wrapper rumsetzen. Der kann dann (ohne Rücksicht auf den Namen der Eigenschaft) für deine Klasse den Schreibzugriff auf nicht öffentlich setzen

Delphi-Quellcode:
type
  // Möglichkeit 1 
  // verdecken der Eigenschaft
  TExtList = class(TList)
    protected
      function getItem(i : Integer) : Pointer;
      procedure setItem(i : Integer; Item : Pointer);
    public
      property Items[i : Integer] : Pointer read getItem;
  end;
Delphi-Quellcode:
type
  // Möglichkeit 2 
  // erstellen einer Wrapperklasse
  TListWrapper = class(TObject)
    private
      FList : TList;
    protected
      function getItem(i : Integer) : Pointer;
      procedure setItem(i : Integer; Item : Pointer);
    public
      property Items[i : Integer] : Pointer read getItem;
  end;
Sehen sich im Prinzip mal recht ähnlich, der wichtigste Unterschied liegt auch eher in den nicht implementierten Methoden. Während du in der ersten Version direkt auf die eigenen Daten zugreifst, musst du in der zweiten Variante immer auf die private Instanz FList zugreifen.
Der Vorteil an Letzterem ist, dass du gar nicht erst versuchst etwas zu verdecken. Dies würde spätestens dann ein Problem werden, wenn die TList plötzlich mal Targets statt Items (mir fällt gerade keine gute Umbenennung ein) als Eigenschaft besitzt.

Gruß Der Unwissende

Andreas H. 12. Mai 2006 08:23

Re: ReadOnly auf TList
 
Hallo,

und schon stehe ich nicht mehr auf dem Schlauch.

Aber irgendwie habe ich es gewusst, ich komme nicht umhin, alle Lesezugriffe zu wrappen. Ich möchte ja nicht nur den Zugriff auf Items erlauben sondern auch IndexOf, First usw.

Warum geht eigenlich nicht Folgendes?
Delphi-Quellcode:
    property FileList:TList read getFFileList;
Gruß Andreas

TBx 12. Mai 2006 08:34

Re: ReadOnly auf TList
 
Zitat:

property FileList:TList read getFFileList;
Weil die Property nur der Verweis auf das Objekt ist.
Diese Deklaration verhindert nur, daß Du den Verweis auf ein anderes Objekt umbiegst.
Die eigentlichen Behandlungsroutinen kommen aus dem Objekt. Und in dem ist der schreibende Zugriff erlaubt.

Gruß

Thomas

Andreas H. 12. Mai 2006 08:40

Re: ReadOnly auf TList
 
Ja,

gleich beim Lesen der gerade abgeschickten Nachricht wars mir auch klar.

Vielen Dank, Andreas :balloon:


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