【发布时间】:2012-06-15 09:57:14
【问题描述】:
我有一个抽象父类,它封装了对 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]; }
因为它最能实现我想要的。
【问题讨论】:
-
请注意,即使集合是只读的,返回的
MyObjects 仍然可以编辑。如果这是一个问题,您可能想做一些事情来只公开对象的克隆,或者将MyObject从class更改为struct。 -
IMO 如果您决定走那条路,最好使用索引器而不是方法。它在功能上非常相似,但允许更直接的声明和获取。您可能还希望实现
IEnumerable<MyObject>以允许以这种方式进行迭代。由于IEnumerable仅指定读取权限,因此您不必公开任何设置功能。 -
@TimS,我想使用索引器,但由于子类使用相同的参数实现索引器,因此无法立即访问父类。因此问题是(子类有不同的返回类型;如果 C# 可以根据返回类型重载,那就太好了......)
-
从技术上讲,.NET 框架允许基于返回类型的重载;但是,C# 没有。如果你真的想去写MSIL,你可以得到你想要的功能。否则,必须使用您的方法或 ReadOnly 路由(或除具有相同参数的索引器之外的任何东西)。
标签: c# inheritance indexer