2017-01-30 7 views
0

私は、長方形の定義/保存に使用されるクラスを持っています。配列プロパティの要素の取得/設定

私は4点を含む2つの配列を持っています。 1つの配列はファイルに保存されたポイント用であり、もう1つは実際に表示されるポイント用です(ユーザーが変更できる)。

保存されたポイントを持つ配列の要素の取得/設定を作成します。ポイントを保存すると、自動的に2番目の配列にコピーされます。

public class MyRectangle 
{ 
    public PointF[] TemporaryPoints = new PointF[4]; 

    protected PointF[] _savedPoints = new PointF[4]; 
    protected PointF[] SavedPoints; 

    //How to do something like this ? 
    protected PointF SavedPoints[int i] 
    { 
     get 
     { 
      return _savedPoints[i]; 
     } 
     set 
     { 
      _savedPoints[i] = value; 
      TemporaryPoints[i] = value; 
     } 
    } 
} 

このように使用:

私はわからない非常に明確にするために、私が作成するコードがあり

SavedPoints[0] = new PointF(1,1);  // SavedPoints = [1;1] TemporaryPoints = [1;1] 
TemporaryPoints[0] = new PointF(4,4); // SavedPoints = [1;1] TemporaryPoints = [4;4] 
SavedPoints[0] = TemporaryPoints[0]; // SavedPoints = [4;4] TemporaryPoints = [4;4] 
+0

を。同様に – CodeConstruct

答えて

1

名前インデクサーは、C#で可能ではありません。

public class MyRectangle 
{ 
    public PointF[] TemporaryPoints = new PointF[4]; 

    protected PointF[] _savedPoints = new PointF[4]; 

    protected PointF this[int i] 
    { 
     get 
     { 
      return _savedPoints[i]; 
     } 
     set 
     { 
      _savedPoints[i] = value; 
      TemporaryPoints[i] = value; 
     } 
    } 
} 

あなたの名前SavedPointsでインデックス付きプロパティにアクセスするためのオプションを与えるものではありません:あなたは、インデクサー構文を使用することができます。これを行うには、この機能をカプセル化するカスタムコレクションSavedPointsCollectionを作成する必要があります。そのタイプのSavedPointsプロパティを定義できます。必要に応じて、SavedPointsCollectionによってアクセスされるTemporaryPintsCollectionを作成することもできます。

カスタムコレクションを実装するには、System.Collections.ObjectModel.Collection<T>を上書きするか、IList<T>インターフェイスを実装することができます。 Collection<T>は、アイテムタイプに標準コレクションを使用する場合に適しています。より洗練された機能を使いたいときは、固定サイズのコレクションとして、IList<T>を使うことができます。何をしたいが、あなたはインデクサーを使用することができ

public class SavedPointsCollection : IList<PointF> { 
    protected PointF[] _values = new PointF[4]; 

    public PointF this[int index] { 
     get 
     { 
      return _values[index]; 
     } 
     set 
     { 
      _values[index] = value; 
      //Set temporary points here 
     } 
    } 

    //Rest of the IList implementation 
} 


public class MyRectangle 
{ 
    private SavedPointsCollection _savedPoints = new SavedPointsCollection(); 

    protected SavedPointsCollection SavedPoints 
    { 
     get { 
      return _savedPoints; 
     } 
    } 
} 
+0

私はこれで欲しいことをすることができます。しかし、私は 'this [int i]'を1回だけ定義することができます。最終的な3番目の配列のインデックスを2つ作成することはできません。 –

+0

@ A.Pissicat:いいえ、インデクサーを複数持つことはできません。プロパティタイプとしてコレクションを使用する必要があります。 – Sefe

0

絶対に明確ではない:

protected PointF this[int index] // Indexer declaration 
{ 
    get 
    { 
     return _savedPoints[index]; 
    } 
    set 
    { 
     _savedPoints[index] = value; 
     TemporaryPoints[index] = value; 
    } 
} 

ます。次に行うことができます。

ここ

は(不完全)IList<T>実装の例です

var rect = new MyRectangle(); 
rect[0] = new PointF (1,1); 
0

このようなことをしたい場合は、を上書きできますインデクサープロパティですが、ではなく、TemporaryPointsプロパティを作成する必要があります。あなたは、あなたが特定のインデックスにのみ値を設定することを可能にするインターフェースを作るべき「プロパティのインデクサプロパティ」を上書きすることはできませんので

public class MyRectangle 
{ 
    private PointF[] _temporaryPoints = new PointF[4]; 
    protected PointF[] _savedPoints = new PointF[4]; 

    // get TemporaryPoint by it's index 
    public PointF TemporaryPoint(int idx) 
    { 
     return (idx < _temporaryPoints.Length ? _temporaryPoints[idx] : default(PointF)); 
    } 

    // set TemporaryPoint value at index idx 
    public void SetTemporaryPoint(int idx, PointF value) 
    { 
     if(idx < _temporaryPoints.Length) _temporaryPoints[idx] = value; 
    } 

    // get SavedPoint by it's index 
    public PointF SavedPoint(int idx) 
    { 
     return (idx < _savedPoints.Length ? _savedPoints[idx] : default(PointF)); 
    }  

    // set SavedPoint value at index idx 
    public void SetSavedPoint(int idx, PointF value) 
    { 
     if(idx < _savedPoints.Length) _savedPoints[idx] = value; 
    } 

    //How to do something like this ? 
    protected PointF this[int idx] 
    { 
     get 
     { 
      return SavedPoint(idx); 
     } 
     set 
     { 
      SetSavedPoint(i, value); 
      SetTemporaryPoint(i, value); 
     } 
    } 
} 

:これらは、あなたはこのようなものを作成するために組み合わせることができます。 そのため、この方法があります:SetTemporaryPoint(int idx, PointF value)。 は、すべての後にあなたがしている欲しかったとして、それはほぼ同じ使用することができます。

SetSavedPoint(0, new PointF(1,1));  // SavedPoints = [1;1] TemporaryPoints = [1;1] 
SetTemporaryPoint(0, new PointF(4,4)); // SavedPoints = [1;1] TemporaryPoints = [4;4] 
SetSavedPoint(0, TemporaryPoint(0)); // SavedPoints = [4;4] TemporaryPoints = [4;4] 

しかし、あなたは唯一のthis[]インデクサプロパティを使用してに本当にしている場合。その後

public enum POINTS_STORAGE { TEMPORARY = 0, SAVED = 1 }; 

あなたでthis[]インデクサプロパティ:

public PointF this[POINTS_STORAGE s, int idx] 
{ 
    get 
    { 
     if(s == POINTS_STORAGE.TEMPORARY) 
      return _temporaryPoints[idx]; 
     else 
      return _savedPoints[idx]; 
    } 

    set 
    { 
     if(s == POINTS_STORAGE.TEMPORARY) 
      _temporaryPoints[idx] = value; 
     else 
      _savedPoints[idx] = value; 
    } 
} 

次にあなたが好きそれを使用することができます:あなたは、いくつか列挙することができます[i]の値を=あなたはTemporaryPointsを設定している

meRectangleReference[POINTS_STORAGE.SAVED, 0] = new PointF(1, 1);  // SavedPoints = [1;1] TemporaryPoints = [1;1] 
meRectangleReference[POINTS_STORAGE.TEMPORARY, 0] = new PointF(4,4); // SavedPoints = [1;1] TemporaryPoints = [4;4] 
meRectangleReference[POINTS_STORAGE.SAVED, 0] = meRectangleReference[POINTS_STORAGE.TEMPORARY, 0]; // SavedPoints = [4;4] TemporaryPoints = [4;4] 
関連する問題