ReadOnlyCollection如何实施IList?后者需要实现Add方法,而ReadOnlyCollection不实现它。但是,ReadOnlyCollection是具体的,可以实例化......
修改
以下代码无法在我的机器上编译:
static void Main(string[] args)
{
List<string> people = new List<string>(){
"Sidney",
"Jim",
"Bob"};
ReadOnlyCollection<string> readOnlyPeople = new ReadOnlyCollection<string>(people);
readOnlyPeople.Add("Frank");
}
在Visual Studio 2010中,最后一个语句中的“添加”调用现在以蓝色加下划线。
答案 0 :(得分:4)
它确实实现了Add,实现只会抛出NotSupportedException
。
该实现使用“explicit interface implementation”,这是一种实现接口的方式,而不直接在实现类中公开接口方法作为public。当您有一个实现多个定义同一成员的接口的类时,它是最有用的(请参阅链接中的示例)。基本上,它看起来像这样:
public interface IList<T>
{
int Add(object value);
// and a whole bunch of other stuff...
}
public class ReadOnlyCollection<T> : IList<T>
{
int IList<T>.Add(object value)
{
throw new NotSupportedException();
}
}
请注意add方法不是公开的,因此如果您有ReadOnlyCollection<T>
的实例,则无法直接在其上调用Add
。但是,如果要查看异常,可以执行的操作是将实例强制转换为接口:
ReadOnlyCollection<string> readOnlyPeople = new ReadOnlyCollection<string>(people);
((IList<string>)readonlyPeople).Add("Frank"); // <-- bang!
您可以实现的另一种方法是直接将变量声明为IList<T>
:
IList<string> readOnlyPeople = new ReadOnlyCollection<string>(people);
readOnlyPeople.Add("Frank"); // <-- this should go 'bang!' too
答案 1 :(得分:1)
它确实实现了Add方法,但该方法的实现只会抛出NotSupportedException。