接口继承 - 从父接口隐藏方法 - 为什么我可以在实现类中同时使用这两种方法?

问题描述:

我想了解接口的继承是如何工作的。当一个接口继承另一个接口但具有相同签名的方法时,编译器会发出一个警告,提醒基础成员是隐藏的(这看起来很合理)。但是,当我稍后在一个类中实现子接口时,我必须实现具有相同签名的父接口方法和子接口方法,这使我感到困惑......我认为,当父成员隐藏时,只需要实现子接口方法?接口继承 - 从父接口隐藏方法 - 为什么我可以在实现类中同时使用这两种方法?

(我来到这一边看着IEnumerableIEnumerable<T>接口)

interface IMyBase 
{ 
    int DoSomething(); 
} 

interface IMyDerived:IMyBase 
{ 
    int DoSomething(); 
} 


class myClass : IMyDerived 
{ 
    int IMyDerived.DoSomething() 
    { 
     throw new NotImplementedException(); 
    } 

    int IMyBase.DoSomething() 
    { 
     throw new NotImplementedException(); 
    } 
} 
+3

你明确地实现了接口。在这种情况下,继承不在桌面上。 – CodeCaster

+0

接口成员不能隐藏,没有类 –

+1

只是不要把'DoSomething()'放在'IMyDerived'中,它已经从'IMyBase'继承了它。把它放在这个界面中会增加零值。我真的很惊讶编译器不会抱怨这个?我希望至少有一个警告。 – Liam

我要实现这两个家长和具有相同签名子接口方法,这让我困惑

那么如果你这样做,你期望会发生什么?

IMyBase x = new myClass(); 

x.DoSomething(); 

有两种方法,IMyBase.SomethingIMyDerived.Something,都有存在,因为两者都可以调用。 myClass仍然实现IMyBase,接口没有以任何方式隐藏。

+0

在这种情况下,编译器的消息是什么意思 “MyDerived.DoSomething()'隐藏了继承的成员'IMyBase.DoSomething()'...”? 它隐藏在哪个上下文中? – Jaxx

+0

@Jaxx当通过'IMyDerived'类型调用时,'IMyBase.DoSomething'被隐藏。您必须首先投射到“IMyBase”才能访问*该方法。 – nvoigt