🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.pascal
2 messages
2 total messages Started by webmajsterek Thu, 13 Dec 2007 11:15
properyty na dynamicznej tablicy
#92319
Author: webmajsterek
Date: Thu, 13 Dec 2007 11:15
18 lines
1352 bytes
mam taki  np obiekt 

type
  Test=class
   private
      B : Array of Byte;
   properyty Data[APos:Word]:Byte read B; 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
i tu nie wiem jak zdefiniowac dynamiczna tablice jako tylko do odczytu 
  end;


chce ochronic pola przd modyfikacja ( nawet z wnetrza unitu ) - ale nie chce
angazowac w to ddoatkowej procedury ( typu getPole )  i odstawiania jej w
properyty -- jest to mozliwe ??

-- 
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Re: properyty na dynamicznej tablicy
#92320
Author: Łukasz 'Maly' Ostrowski
Date: Thu, 13 Dec 2007 11:58
67 lines
2723 bytes
webmajsterek@poczta.onet.pl wrote:
> mam taki  np obiekt
>
> type
>  Test=class
>   private
>      B : Array of Byte;
>   properyty Data[APos:Word]:Byte read B;
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> i tu nie wiem jak zdefiniowac dynamiczna tablice jako tylko do odczytu
>  end;

Najpierw snip:

type
  TDynByteArray = array of byte;
  TTest         =
    class
      private
        B : TDynByteArray;
        function GetB(APos:longint):Byte; // ****
      public
        property Data[APos:longint]:Byte read GetB;
        property Data2 : TDynByteArray read B;
    end;

function TTest.getB(APos:Longint):Byte;
begin
  Result:=B[APos];
end;

procedure blah(test:TTest);
begin
  SetLength(test.B, 123);
  test.B[10]:=123;             // *
end;

var
  test : TTest;

begin
  test := TTest.Create;
  blah(test);
  Writeln(test.Data[10]);
  SetLength(test.Data2, 1337); // **
  test.Data2[123] := 123;      // ***
end.

> chce ochronic pola przd modyfikacja ( nawet z wnetrza unitu ) - ale
> nie chce angazowac w to ddoatkowej procedury ( typu getPole )  i
> odstawiania jej w properyty -- jest to mozliwe ??

1. W obrębie jednostki kompilacji wszystko jest "public", w Object
   Pascalu jest tak w przeciwieństwie do większości języków, z racji
   braku "przyjaźni" klas. Więc, w obrębie pojedynczego unitu możesz
   sobie o enkapsulacji najwyżej pomarzyć. Patrz - fragment
   oznaczony (*).

2. Musisz zrobić proxy metode, patrz (****).Inaczej tego nie zrobisz,
   a jeżeli  wystawisz całego dynamicznego arraya to kompletnie
   tracisz enkapsulacje/ochrone tego pola. Patrz (***). I do
   tego nie tylko zawartości, ale też stanu tegoż arraya, patrz (**).

-- 
Pozdrawiam,
Łukasz 'Maly' Ostrowski.
http://maly.nemo.pl/ 
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads