2017-01-30 38 views
0

我有一個類用來定義/保存一個矩形。獲取/設置數組屬性的元素

我有2個數組包含4個點。一個數組用於保存在文件中的點,另一個用於實際顯示的點(可由用戶修改)。

我想爲保存點的數組中的元素創建一個get/set。當我保存一個點時,它會自動複製到第二個數組中。

我不知道是很清楚,有我想要創建的代碼:像這樣來使用

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

要設置TemporaryPoints [i] =值;以及 – 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屬性。如有必要,您還可以創建一個TemporaryPintsCollection,由SavedPointsCollection訪問。

要實現自定義集合,你可以重寫System.Collections.ObjectModel.Collection<T>或實現IList<T>接口。 Collection<T>當您想要爲項目類型使用標準集合時很好。當您想要做更多花式功能時,可以使用IList<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]'一次,所以我不能爲最終的第三個數組創建2個索引器? –

+0

@ A.Pissicat:不,你不能有多個索引器。您需要將集合用作屬性類型。 – Sefe

0

不是絕對清楚什麼,但你可以使用一個索引:

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

那麼你可以這樣做:

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

如果你想要做這樣的事情,你可以覆蓋this[]索引器屬性,但您應該創建一個屬性TemporaryPoints而不是將其設置爲public field。這些可以結合到這樣創造的東西:

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; 
    } 
} 

然後你可以使用它像:

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]