1

我有一个抽象父类,它封装了对 MyObjects 数组的访问:

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]; } 因为它最能实现我想要的。

4

1 回答 1

3

有一个ReadOnlyCollection类可以完成您正在寻找的内容。这充当了数组的包装器。使用诸如ReadOnlyCollection<MyObject> Data { get { return array.AsReadOnly(); } }Mutating 底层数组之类的东西会影响 ReadOnlyCollection。该集合本身是相对轻量级的,因此您可以在每次访问该属性时创建一个新集合,或者如果频繁访问该属性(在调用站点或在类本身内),则使用缓存。

至于你的第二个问题,答案是肯定的。C# 中的索引器很像属性。如果可以继承(或需要,例如由于接口)属性,则索引器也是如此。

于 2012-06-15T01:47:03.570 回答