假设我们有一个接口层次结构:IBaseThing<T>
和IChildThing:IBase<ChildThing>
。
也有两个这样的类:
internal abstract class Base<T>
{
public abstract IBaseThing<T> Thing {get;}
}
和
internal class Concrete:Base<ChildThing>
{
public override IChildThing Thing
{
get
{
return GetChildThing();
}
}
}
将会发生以下情况:
“具体”未实现继承的抽象成员
“ Base.get”
我想跳过整个
(IChildThing)this.Thing
类中的Concrete
转换。我应该怎么办?
最佳答案
你不能那样做。类型系统正确地反对您尝试更改覆盖类中的方法类型。 IChildThing可能源自IBaseThing,但这不是同一回事。例如,您稍后可能会向IChildThing添加更多方法。然后,一个类(Concrete)将保证返回的对象具有与基类不同的签名-这是类型错误。
如果在某些情况下需要引用IChildThing,该如何处理:
internal class Concrete : Base<ChildThing>
{
public override IBaseThing<ChildThing> Thing
{
get { return ChildThing; }
}
public IChildThing ChildThing { get; set; }
}
如果您拥有的只是一个基地,那么您将无法安全地获得IChildThing。这就是这种强类型系统的本质。如果这是一个问题,那么如果您给出一个更具体的示例,我也许可以建议如何进行重组以避免该问题。
关于c# - 接口(interface)继承和抽象方法重写,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20468082/