繁体   English   中英

C#具有自引用约束的通用抽象类

[英]C# Generic abstract class with self referencing constraint

我遇到了创建查询类的通用列表的问题。 这些查询类派生自具有自引用类型约束的基本抽象泛型类。

精简的基类和派生类是:

public abstract class AbstractQuery<TQuery, TResult> 
    where TQuery : AbstractQuery<TQuery, TResult> 
{
    public IEnumerable<TResult> Query ()
    {
        return new List<TResult>();
    }
}

public class FirstQuery : AbstractQuery<FirstQuery, object> { }

public class SecondQuery : AbstractQuery<SecondQuery, object> { }

应用程序代码想要创建这些查询的列表并在每个查询上执行Query方法,例如:

        var queryList = new List<AbstractQuery<AbstractQuery, object>>
            {
                new FirstQuery(),
                new SecondQuery()
            };

        foreach ( var query in queryList )
        {
            query.Query();
        }

此部分不构建,因为List类型当然无效。 所以我的问题是我可以使用哪种类型的List来正​​确使用此代码?

作为旁注,我们通过添加具有AbstractQuery实现的Query方法签名的IQuery接口来解决另一种方式,但仍希望查看初始方式是否可行。 是的,在实际代码中有一个自引用约束的原因 - 它需要一些反射代码。

您正在尝试将AbstractQuery<TQuery, TResult>视为与TQuery协变。 对于泛型参数,类不能是协变的。 只允许接口(甚至在某些情况下,仅在某些情况下)使其通用参数变量(协变或逆变)。 这就是为什么它可以使用一个接口而不是一个抽象类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM