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