3 回答
TA贡献1785条经验 获得超4个赞
更改
ISomeObject.Objects
为返回 anIEnumerable<ISomeObject>
的另一个缺点是客户端不能再使用索引(这在我的用例中非常相关)。
索引不仅受IList<T>
接口支持,还受IReadOnlyList<T>
接口支持。因为IReadOnlyList<T>
不允许修改,所以它可以(并且是)协变,就像现在一样IEnumerable<T>
。
因此,只需将返回类型更改为IReadOnlyList<ISomeObject>
并返回原始列表。
当然,没有什么可以阻止调用者将结果转换为List<SomeObject>
,但是调用者应该拥有对该列表的完全访问权限,因此不存在安全风险。
TA贡献1993条经验 获得超5个赞
您可能想尝试封装您List<SomeObject>
的实现细节并返回IReadOnlyList<SomeObject>
。然后SomeObject
,ISomeObject
由于IReadOnlyList
变化,在接口实现中也不需要强制转换 want - 你将能够返回你的Objects
as IReadOnlyList<ISomeObject>
。
然后只需添加一些操作来改变您的基础列表,如Add
或Remove
容器类型(如果需要)。
我还要提到的接口不是那么好了限制-邪恶的消费者可以轻松地投你ISomeObject
要SomeObject
和他做想要的一切,或许,你应该重新考虑你的设计。你最好坚持不变性和封装性这样的东西来提供可用的api。显式使用可变构建器,然后在合理的情况下用于不可变类。
- 3 回答
- 0 关注
- 193 浏览
添加回答
举报