接口继承和新关键字

时间:2011-03-23 02:16:52

标签: c# interface

我想:

public interface IBase
{
    MyObject Property1 { get; set; }
}

public interface IBaseSub<T> : IBase
{
    new T Property1 { get; set; }
}

public class MyClass : IBaseSub<YourObject>
{
    public YourObject Property1 { get; set; }
}

但是这不能编译。它给出了错误:

//This class must implement the interface member IBase.Property1

有人可以对此有所了解吗?我认为它应该有用..

由于

2 个答案:

答案 0 :(得分:14)

IBaseSub<T> 需要 IBase。我说“需要”,因为它更准确地反映了实际含义,而不是说它“继承”IBase,这意味着覆盖和其他根本不会发生接口的事情。实际上可以说实现IBaseSub<T>的类实现两者,如下所示:

public class MyClass : IBase, IBaseSub<YourObject>

回到我所说的关于继承的内容 - 接口没有这样的东西,这意味着只是因为两个接口都有一个具有相同名称的属性,派生的接口不会覆盖或隐藏基础接口。这意味着您的班级现在必须字面上实现两个名称相同的属性才能完成这两个合同。您可以使用explicit implementation执行此操作:

public class MyClass : IBase, IBaseSub<YourObject>
{
    public YourObject Property1 { get; set; }
    MyObject IBase.Property1 { get; set; }
}

答案 1 :(得分:2)

您需要实现IBaseIBaseSub<YourObject>的属性,因为后者会扩展前者。

new中使用IBaseSub<T>并不会让您“有必要”关于拥有MyObject Property1 { get; set; }的必要性。它只是允许您声明另一个名为Property1属性,IBaseSub<T>的实现者必须拥有该属性。

由于MyClass中不能有两个具有相同名称的属性,因此您将被迫明确地实现其中一个:

public class MyClass : IBaseSub<YourObject>
{
    MyObject IBase.Property1 { get; set; }
    public YourObject Property1 { get; set; }
}