c# - Generic 基类继承自 Generic Interface

标签 c# generics c#-4.0

出于某种原因,我正在努力通过使用通用基类来实现通用接口(interface)的属性,如下所示:

public interface IParent<TChild> where TChild : IChild
{
    TChild Child { get; }
}

public interface IChild { }

然后我有一个基类:

public class ParentBase<TChild> : IParent<TChild> where TChild : IChild
{
    private TChild _child;
    public ParentBase(TChild child)
    {
        this._child = child;
    }
    #region IParent<TChild> Members

    public TChild Child
    {
        get { return _child; }
    }

    #endregion
}

现在我有一个新的 Parent Derivative 和 Child 对象如下:

public class MyChild : IChild { }

public class MyParent : ParentBase<MyChild>, IParent<IChild> 
{
    public MyParent(MyChild child)
        : base(child)
    {
    }
}

我想实例化它并获取抽象(接口(interface)类型)传递给消费者,如下所示:

IParent<IChild> parent = new MyParent(new MyChild());

但出于某种原因我无法正确实现 TChild,即使我已经在 ParentBase 上定义了属性 public TChild Child,编译器说它没有实现,即使我尝试显式实现。 如您所见,约束一直贯穿到基类。

最佳答案

您正在从 ParentBase<MyChild> 派生 MyParent|和 IParent<IChild> .没有实现

IParent<IChild> { IChild Child{get; } }

添加显式实现将允许您的原始代码编译

public class MyParent : ParentBase<MyChild>, IParent<IChild>
{
    public MyParent(MyChild child)
        : base(child)
    {
    }

    #region Implementation of IParent<IChild>

    IChild IParent<IChild>.Child
    { 
        get { return base.Child; }
    }

    #endregion
}

如果你也像这样使 IParent 协变:

public interface IParent<out TChild> where TChild : IChild
{
    TChild Child { get; }
}

那么你现在可以这样做了

IParent<IChild> parent = new MyParent(new MyChild());

ParentBase<MyChild> parent2 = new MyParent(new MyChild());

IParent<IChild> parent3 = parent2;

正如@svick 在回答中指出的那样,借助协方差,您可以通过不从 IParent<IChild> 派生来简化并删除显式接口(interface)实现。

关于c# - Generic 基类继承自 Generic Interface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10189793/

相关文章:

java - 使用 JPA 和 Criteria API 连接泛型类型

当我使用 TimeSpan 时,MySQL 连接器抛出异常只有 TimeSpan 对象可以被 MySqlTimeSpan 序列化

c# - _=> 这个下划线在 Lambda 表达式中是什么意思?

c# - 隐式调用父构造函数

c# - dotMemory快照导致wpf崩溃

c# - 启动一个在我的 Windows 服务中不起作用的进程

wpf - WPf 中 Intellisense 支持的 TextBox

c# - HTML 到 PDF 转换器

generics - Kotlin 具体化的泛型不会按计划保持类型

java - 使用泛型返回参数类的实例