C#继承索引器:另一种方法

C#继承索引器:另一种方法,c#,inheritance,indexer,C#,Inheritance,Indexer,我有一个抽象父类,它封装了对MyObject数组的访问: public abstract class MyObjectIterator { public MyObjectIterator(MyObject[] MyObjects) { //constructor } public Vector2 [] Coords { //A Get Function } public Model[] Params { //A Get Function } //THIS I

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

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];
但不提供对MyObject任何元素的
set
访问

我有一个相关的问题:如果我在父类上有一个索引器,那么当您有一个子类的对象时,可以使用它吗

编辑:
我已决定采用这种方法
公共MyObject MyObject(int-index){返回MyObjects[index];}
因为它最能实现我想要的。

有一个类可以实现你想要的。这充当数组的包装器。使用类似于
ReadOnlyCollection Data{get{return array.AsReadOnly();}}}
的方法改变基础数组将影响ReadOnlyCollection。集合本身是相对轻量级的,因此每次访问属性时都可以创建一个新集合,或者如果频繁访问属性(无论是在调用站点还是在类本身中),可以使用缓存


至于你的第二个问题,答案是肯定的。它们很像财产。如果一个属性可以被继承(或者是必需的,例如由于接口),那么索引器也可以被继承。

并且为了澄清,如果子类实现了自己的索引器,那么父类在不强制转换到父类的情况下将不可用?是;子实现将隐藏父实现的。但是,如果使用多态性,父[i]将使用父实现而不是执行子[i]的代码(如果索引器是隐藏的而不是重写的[父索引器必须是虚拟的])。请注意,即使集合是只读的,返回的
MyObject
s仍然可以编辑。如果这是一个问题,您可能希望只公开对象的克隆,或者将
MyObject
class
更改为
struct
。它在功能上非常相似,但允许更直接的声明和获取。您可能还希望实现
IEnumerable
,以允许以这种方式进行迭代。由于
IEnumerable
仅指定读取访问,因此您不必公开任何集合功能。@TimS,我想使用索引器,但由于子类使用相同的参数实现索引器,因此无法立即访问父类。因此产生了一个问题(子类有不同的返回类型;如果C#可以基于返回类型重载,那将是非常好的…)从技术上说,.NET framework允许基于返回类型重载;然而,C#没有。如果你真的想去写MSIL,你可以得到你想要的功能。否则,必须使用您的方法或只读路由(或除具有相同参数的索引器之外的任何内容)。