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

本文关键字:另一种 方式 继承 索引 | 更新日期: 2023-09-27 18:37:10

我有一个抽象的父类,它封装了对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; }
}

this的子类已经实现了用于其他目的的单个索引索引器,因此我不能使用它来返回MyObject。
但是,由于返回数组是不安全/不好的做法,因为这意味着可以修改其中的元素,我正在寻找一种方法来提供整洁的界面来访问单个元素,例如

MyObject = Child.MyObjects[i];

但不提供对 MyObject 任何元素的set访问。

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

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

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

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

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