2012-06-15 32 views
1

我有一個封裝了訪問MyObjects數組的抽象父類:C#繼承索引:另一種

public abstract class MyObjectIterator 
{ 
    public MyObjectIterator(MyObject[] MyObjects) { //constructor } 

    public Vector2 [] Coords { //A Get Function } 

    public Model[] Params { //A Get Function } 

    //THIS ISN'T SAFE! CAN STILL CHANGE MEMBERS OF THE SET 
    public MyObject[] MyObjects{ get; protected set; } 
} 

一個子類的這個已經實現了用於其它目的的單一指標索引,所以我不能使用它返回一個MyObject。
但是,由於返回數組是不安全/不好的做法,因爲這意味着內部的元素可以被修改,所以我正在尋找一種方法來提供訪問單個元素的整潔界面,

MyObject = Child.MyObjects[i]; 

但沒有提供set訪問MyObjects的任何元素。

我有一個相關的問題是:如果我有一個父類的索引器,當你有一個子類的對象時可以使用它嗎?

編輯:
我已經決定去與方法
public MyObject MyObject(int index) { return MyObjects[index]; } 因爲它最完成我是想什麼。

+0

請注意,即使集合是隻讀的,仍然可以編輯返回的「MyObject」。如果這是一個問題,你可能想要做一些事情來暴露這些對象的克隆,或者把'MyObject'從一個'class'變成'struct'。 –

+0

海事組織如果決定走這條路線,最好是用索引器而不是方法。它在功能上非常相似,但允許更直接的聲明和獲取。你也可能想實現'IEnumerable '來允許這種迭代。由於'IEnumerable'只指定讀取訪問權限,因此您不必公開任何設置功能。 –

+0

@TimS,我想使用索引器,但因爲子類實現了具有相同參數的索引器,所以父類不能立即訪問。因此,問題(子類有不同的返回類型;如果C#可以基於返回類型重載,那將是美妙的...) – 3Pi

回答

3

有一個ReadOnlyCollection類可以完成你正在尋找的東西。這充當陣列的包裝。使用類似ReadOnlyCollection<MyObject> Data { get { return array.AsReadOnly(); } }突變基礎數組將影響ReadOnlyCollection。集合本身相對輕量級,所以每次訪問屬性時都可以創建一個新集合,或者如果頻繁訪問屬性(在調用站點或類本身內),則使用緩存。

至於你的第二個問題,答案是肯定的。 Indexers in C#更像是屬性。如果一個屬性可以被繼承(或者需要,比如由於一個接口),索引器也可以。

+0

爲了澄清,如果子類實現了自己的索引器,那麼父類不會在沒有投射到父類的情況下可用? – 3Pi

+0

是;子實現會隱藏父項。但是,如果您使用的是多態,Parent [i]將使用父級的實現而不是執行Child [i]的代碼(如果索引器被隱藏而不是覆蓋[父級必須是虛擬的])。 – GGulati