间接实现eer接口时,子类B1显式实现方法报错原因咨询
问题原因分析
先看你的代码:
interface eer { public abstract void S1<T>(T? t) where T : struct; public abstract void S1<T>(T? t); } class A1 : eer { void eer.S1<T>(T? t){} void eer.S1<T>(T? t) where T:default{} } class B1 : A1 { void eer.S1<T>(T? t) { } //error void eer.S1<T>(T? t) where T : default { } //error }
错误的核心原因有两个:
- 接口实现责任已由父类完成
显式实现的接口成员是绑定到接口类型的隐式私有成员。当A1通过显式实现完成eer接口所有方法的实现后,子类B1继承A1时,已经间接满足了eer接口的实现要求,不需要再重复实现接口成员。 - 显式实现的接口成员无法被子类重新实现
显式实现的接口方法在父类中是隐式私有的,子类无法直接访问或重写这些成员。当你在B1中尝试再次显式实现eer的方法时,编译器会误认为你要让B1直接实现eer接口,但此时B1已经通过A1间接实现了接口,这种矛盾导致编译器抛出“包含类型未实现eer接口”的错误——本质是编译器无法处理这种重复实现的冲突。
如果想要在B1中修改接口方法的行为,不能用显式实现的方式,而是需要在A1中将接口方法改为非显式实现(比如public virtual方法),再在B1中重写:
interface eer { public abstract void S1<T>(T? t) where T : struct; public abstract void S1<T>(T? t); } class A1 : eer { public virtual void S1<T>(T? t) where T : struct {} public virtual void S1<T>(T? t) {} } class B1 : A1 { public override void S1<T>(T? t) where T : struct {} public override void S1<T>(T? t) {} }
内容的提问来源于stack exchange,提问作者Jason9789
相关产品推荐
相关产品推荐

