假设我们有一个接口层次结构: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/

10-11 17:11