c# - 接口(interface)继承和抽象方法覆盖

标签 c# inheritance interface abstraction

假设我们有一个接口(interface)层次结构: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();
        }
     }
}

接下来会发生什么:

'Concrete' does not implement inherited abstract member 'Base.get'

我想跳过类型转换 (IChildThing)this.Thing遍布Concrete类(class)。 我该怎么办?

最佳答案

你不能那样做。类型系统正确地反对您尝试更改重写类中的方法类型。 IChildThing 可能派生自 IBaseThing,但它们不是一回事。例如,稍后您可能会向 IChildThing 添加更多方法。然后一个类 (Concrete) 将 promise 返回一个与基类具有不同签名的对象——这是一个类型错误。

如果在某些情况下需要引用 IChildThing,可以这样:

internal class Concrete : Base<ChildThing>
{
    public override IBaseThing<ChildThing> Thing
    {
        get { return ChildThing; }
    }

    public IChildThing ChildThing { get; set; }
}

如果您只有一个 Base,那么您就无法安全地访问 IChildThing。这就是像这样的强类型系统的本质。如果这是一个问题,那么如果您给出一个更具体的示例,我可能会建议如何进行重组以避免该问题。

关于c# - 接口(interface)继承和抽象方法覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20468082/

相关文章:

.net - .Net 继承和成员可见性的奇怪问题

c++ - C++继承中的构造函数重载问题

python - Python 协议(protocol)/接口(interface)的综合列表

c# - 列表接口(interface) : from Java to C#

C# 在 refcursor(Oracle) 中读取游标

c# - 如何限制应用程序只能从已知的 U 盘运行?

c# - 挂接到 HttpModule 中的 Application_Start

c# - 使用反射获取 Nullable Boolean 的值

objective-c - 使用协议(protocol)与继承的优点和缺点是什么?

java - 通过接口(interface)发送数组列表会导致类转换异常吗?