所以在我班上我有这个私人只读成员ICollection<IMusicItem> playlist
。我更喜欢使用界面ICollection<T>
。
我想使用List<T>.AddRange(IEnumerable<T> items)
。在我的方法中,即使我在构造函数中将ICollection
实例化为List<T>
,也会将ICollection<T>
强制转换为new List<T>()
。
这是不好的做法,有没有更好的方法呢?
或者只是拥有List<T>
答案 0 :(得分:6)
这是不好的做法,因为它破坏了封装。使用接口是好的,但是如果必须将对象强制转换为具体类型则没有意义。就好像你不知道具体的类型一样,或者如果你决定稍后再切换到另一种类型,这就是未来的错误。
请改用扩展方法:
public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> items)
{
foreach (var item in items)
collection.Add(item);
}
注意:最好在公共API中公开接口,以便以后可以随意更改实现对象,但是在私有字段上是否可以进行样式处理。你也可以使用具体的课程。
答案 1 :(得分:3)
这不是危险的(当做得对时),毫无意义。
if (playlist is IList<IMusicItem>)
{
(playList as IList<IMusicItem>).AddRange(items);
}
else
{
// still need a foreach here
}
真正的问题是“我更愿意使用界面ICollection<T>
”。
为什么到底?你的问题表明它总是一个List,所以为什么不公开它?
将其公开为更一般的ICollection<>
只有在可能存在除List之外的其他实现时才有意义,然后转换是无用的。