5

Delphi などのいくつかの言語では、インデクサーを作成するための非常に便利な方法があります。クラス全体だけでなく、単一のプロパティにもインデックスを付けることができます。たとえば、次のようになります。

type TMyClass = class(TObject)
protected
    function GetMyProp(index : integer) : string;
    procedure SetMyProp(index : integer; value : string);
public
    property MyProp[index : integer] : string read GetMyProp write SetMyProp;
end;

これは簡単に使用できます。

var c : TMyClass;

begin
    c = TMyClass.Create;
    c.MyProp[5] := 'Ala ma kota';
    c.Free;
end;

C#で同じ効果を簡単に達成する方法はありますか?

4

1 に答える 1

14

よく知られている解決策は、プロキシ クラスを作成することです。

public class MyClass
{
    public class MyPropProxy
    {
        private MyClass c;

        // ctor etc.

        public string this[int index]
        {
            get
            {
                return c.list[index];
            }
            set
            {
                c.list[index] = value;
            }
        }
    }

    private List<string> list;
    private MyPropProxy myPropProxy;

    // ctor etc.

    public MyPropProxy MyProp
    { 
        get
        {
            return myPropProxy;
        }
    }
}

しかし (これが実際に問題を解決することを除いて)、この解決策は主に短所のみをもたらします:

  • これにより、(おそらく) 多くの小さなプロキシ クラスによってコードが汚染されます。
  • 提示されたソリューションはカプセル化を少し破ります(内部クラスは外部クラスのプライベート メンバーにアクセスします)。より良いものは、 list のインスタンスをMyPropProxyの ctor に渡すことで、さらに多くのコードが必要になります。
  • 内部ヘルパー クラスを公開することは、私が提案するものではありません。追加のインターフェースを導入することでそれを解決することもできますが、実装するエンティティが 1 つ増えます (テスト、保守など)。

ただし、別の方法があります。また、コードを少し汚染しますが、前のものよりも確実に少なくなります。

public interface IMyProp
{
    string this[int index] { get; }
}

public class MyClass : IMyProp
{
    private List<string> list;

    string IMyProp.this[int index]
    {
        get
        {
            return list[index];
        }
        set
        {
            list[index] = value;
        }
    }

    // ctor etc.

    public IMyProp MyProp 
    {
        get
        {
            return this;
        }
    }
}

長所:

  • プロキシ クラス (メモリ内のスペースを占有し、単一の目的のみを果たし、(最も単純なソリューションでは) カプセル化を破る) はありません。
  • シンプルなソリューション。別のインデックス付きプロパティを追加するためのコードはほとんど必要ありません

短所:

  • プロパティごとに異なるパブリック インターフェイスが必要です
  • インデックス付きプロパティの増加に伴い、クラスはますます多くのインターフェイスを実装します

これは、C# にインデックス付きプロパティを導入する最も簡単な (コードの長さと複雑さの点で) 方法です。もちろん、誰かがさらに短くて単純なものを投稿しない限り.

于 2014-04-15T10:45:18.623 に答える