СОЛО на клавиатуре

четверг, июня 01, 2006

Интересная штука- индексируемые свойства С# и Pascal(Delphi)

Прикольная штука Вопрос как в C# сделать код который может реализовать вот это
program IndexerTest;

{$APPTYPE CONSOLE}

{%TogetherDiagram 'ModelSupport_IndexerTest\default.txaPackage'}
{%TogetherDiagram 'ModelSupport_IndexerTest\IndexerTest\default.txaPackage'}
{%TogetherDiagram 'ModelSupport_IndexerTest\default.txvpck'}
{%TogetherDiagram 'ModelSupport_IndexerTest\IndexerTest\default.txvpck'}

uses
  SysUtils;

type
  TTestIndexer = class
  strict private
    procedure SetProperty1(i:integer;val : Integer);
    function GetProperty1(i:integer) : Integer;
    procedure SetProperty2(i:integer;val : Integer);
    function GetProperty2(i:integer) : Integer;

  private
    ar: array of integer;
  public
    constructor Create;
    property Property1 [i :integer]: Integer read GetProperty1 write SetProperty1;
    property Property2 [i :integer]: Integer read GetProperty2 write SetProperty2;
  end;
var
  ///<directed>True</directed>
IndTestArr: array[0..2] of TTestIndexer;
  i,j:integer;
constructor TTestIndexer.Create;
var
i:integer;
begin
  inherited;
  SetLength(ar,3);
  for i := 0 to 2 do
     ar[i] := i;
end;

function TTestIndexer.GetProperty1(i:integer): Integer;
begin
result := ar[i];
end;
procedure TTestIndexer.SetProperty1(i:integer;val : Integer);
begin
ar[i]:= val;
end;
function TTestIndexer.GetProperty2(i:integer): Integer;
begin
result := ar[i];
end;
procedure TTestIndexer.SetProperty2(i:integer;val : Integer);
begin
ar[i]:= val;
end;

begin
  { TODO -oUser -cConsole Main : Insert code here }
  for I := 0 to 2 do
  begin
    IndTestArr[i] := TTestIndexer.Create;
    IndTestArr[i].Property1[2] := 2;
  end;
  for I := 0 to 2 do
  begin
    for j := 0 to 2 - 1 do
    with IndTestArr[i] do
      Write(Property1[j],'  ',Property2[j]);
    Writeln;
  end;
  readln;
end.
Что тут интересно так это то что на C# влоб задачу не решить.
Нужно исхитриться
Такой код не пройдет
class testind
     {

        int [] ar;
        public testind ()
        {
           ar = new int[3];
           ar[0] = 1;
           ar[1] = 2;
           ar[2] = 3;
        }
      void setP1( int i, int val)
      {
          ar[i] = val;
      }
      int getP1( int i)
      {
       return ar[i];
      }
       public int this[int i]
          {
           get{ return ar[i];}
           set{ ar[i] = value;}
          }
      public int this[int i]
      {
          get{ return this.getP1(i);}
          set{ return this.setP1(i,value);}
      }
     }
А такой пройдет
     class testind: IMyProp1,IMyProp2
     {
       int IMyProp1.this[int i]
       {
        get{ return ar[i];}
        set{ ar[i] = value;}
       }

       int IMyProp2.this[int i]
       {
        get{ return ar[i];}
        set{ ar[i] = value;}
       }
     public IMyProp1 MyProp1{ get {return this;}}
     public IMyProp2 MyProp2{ get {return this;}}

        int [] ar;
        public testind ()
        {
           ar = new int[3];
           ar[0] = 1;
           ar[1] = 2;
           ar[2] = 3;
        }
     }

Только использовать придется таким способом – через указатель на интерфейс
MpTd.MyProp1[1] = 10;
MpTd.MyProp1[3] = 10;