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]; }
因为它最能实现我想要的。
有一个 ReadOnlyCollection 类可以完成您正在寻找的内容。这充当数组周围的包装器。使用类似 ReadOnlyCollection<MyObject> Data { get { return array.AsReadOnly(); } }
更改底层数组将影响 ReadOnlyCollection。集合本身是相对轻量级的,因此可以在每次访问属性时创建一个新集合,或者在频繁访问属性时使用缓存(在调用站点或在类本身内)。
至于你的第二个问题,答案是肯定的。C# 中的索引器非常类似于属性。如果属性可以继承(或需要,例如由于接口),索引器也将继承。