关于接口的问题

时间:2011-08-29 02:13:57

标签: .net

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中,最后一个语句中的“添加”调用现在以蓝色加下划线。

2 个答案:

答案 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