C#中怎么访问接口成员,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
C#对接口成员访问
C#对接口方法的调用和采用索引指示器访问的规则与类中的情况也是相同的。如果底层成员的命名与继承而来的高层成员一致,那么底层成员将覆盖同名的高层成员。但由于接口支持多继承,在多继承中,如果两个父接口含有同名的成员,这就产生了二义性(这也正是C#中取消了类的多继承机制的原因之一),这时需要进行显式的定义:
using System ; interface ISequence { int Count { get; set; } } interface IRing { void Count(int i) ; } interface IRingSequence: ISequence, IRing { } class CTest { void Test(IRingSequence rs) { //rs.Count(1) ; 错误, Count 有二义性 //rs.Count = 1; 错误, Count 有二义性 ((ISequence)rs).Count = 1; // 正确 ((IRing)rs).Count(1) ; // 正确调用IRing.Count } }
上面的例子中,前两条语句rs .Count(1)和rs .Count = 1会产生二义性,从而导致编译时错误,因此必须显式地给rs 指派父接口类型,这种指派在运行时不会带来额外的开销。
再看下面的例子:
using System ; interface IInteger { void Add(int i) ; } interface IDouble { void Add(double d) ; } interface INumber: IInteger, IDouble {} class CMyTest { void Test(INumber Num) { // Num.Add(1) ; 错误 Num.Add(1.0) ; // 正确 ((IInteger)n).Add(1) ; // 正确 ((IDouble)n).Add(1) ; // 正确 } }
调用Num.Add(1) 会导致二义性,因为候选的重载方法的参数类型均适用。但是,调用Num.Add(1.0) 是允许的,因为1.0 是浮点数参数类型与方法IInteger.Add()的参数类型不一致,这时只有IDouble.Add 才是适用的。不过只要加入了显式的指派,就决不会产生二义性。
接口的多重继承的问题也会带来C#对接口成员访问上的问题。例如:
interface IBase { void FWay(int i) ; } interface ILeft: IBase { new void FWay (int i) ; } interface IRight: IBase { void G( ) ; } interface IDerived: ILeft, IRight { } class CTest { void Test(IDerived d) { d. FWay (1) ; // 调用ILeft. FWay ((IBase)d). FWay (1) ; // 调用IBase. FWay ((ILeft)d). FWay (1) ; // 调用ILeft. FWay ((IRight)d). FWay (1) ; // 调用IBase. FWay } }
上例中,方法IBase.FWay在派生的接口ILeft中被Ileft的成员方法FWay覆盖了。所以对d. FWay (1)的调用实际上调用了。虽然从IBase-> IRight-> IDerived这条继承路径上来看,ILeft.FWay方法是没有被覆盖的。我们只要记住这一点:一旦成员被覆盖以后,所有对其的访问都被覆盖以后的成员"拦截"了。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。