【发布时间】:2020-11-14 00:39:09
【问题描述】:
我有一个包含集合 (Collection<MyItem> myItems) 的类。我希望能够私下修改此 Collection 并通过公共属性将其作为只读返回(如果可能,在 O(1) 中)。我正在考虑使用ReadOnlyCollection,但问题是项目(MyItem)不是只读的。所以我创建了一个只读包装类(ReadOnlyMyItem)。如何让 ReadOnlyCollection 通过方括号运算符返回包装类 (ReadOnlyMyItem) 而无需再次构建整个 Collection,我希望一切都保持 O(1)。
我正在考虑创建一个派生自ReadOnlyCollection (class ReadOnlyMyCollection : ReadOnlyCollection<MyItem> 或 class ReadOnlyMyCollection : ReadOnlyCollection<ReadOnlyMyItem>) 的新类,它通过方括号运算符返回只读包装类 (ReadOnlyMyItem) ,但是方括号运算符未标记为虚拟并且返回类型甚至不相同,或者构造函数没有要使用的包装类 (IList<ReadOnlyMyItem>) 的 IList。我应该从头开始构建课程 (ReadOnlyMyCollection) 吗?
代码如下所示:
public class MyClass
{
public ReadOnlyCollection<ReadOnlyMyItem> MyItems { get => GetMyItems(); }
private List<MyItem> myItems;
// ...
private ReadOnlyCollection<ReadOnlyMyItem> GetMyItems()
{
throw new NotImplementedException();
}
// ...
}
public class MyItem
{
// ...
}
public class ReadOnlyMyItem
{
private readonly MyItem myItem;
// ...
public ReadOnlyMyItem(MyItem myItem) => this.myItem = myItem;
// ...
}
【问题讨论】:
-
您可以从
ReadOnlyMyItem派生MyItem,将所有设置访问器放入派生类中。 -
@KlausGütter 谢谢你的想法,但是我必须在
MyClass中使用List<ReadOnlyMyItem>,所以当我返回new ReadOnlyCollection<ReadOnlyMyItem>(myItems)时我不会收到错误消息,对吧?这意味着当我想使用它们时,我总是必须将它们转换回MyItem。也可以在课堂外将物品投射到MyItem。