You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#如何实现基类泛型构造函数参数为派生类类型?

解决方案:让基类构造函数的Position泛型参数匹配派生类类型

你给出的代码不可行,因为抽象类BaseClass并非泛型类,构造函数里的T未定义,编译器会直接报错。

要实现你想要的效果——让基类构造函数接收的Position<T>中的T恰好是派生类的类型,需要将基类定义为泛型类,并通过递归泛型约束确保T是当前基类的派生类型。

基础实现方案

// 假设你已定义的Position泛型类
public class Position<T>
{
    // 可根据需求添加成员
}

// 泛型抽象基类,约束T必须是BaseClass<T>的派生类
public abstract class BaseClass<T> where T : BaseClass<T>
{
    public Position<T> Position { get; }

    protected BaseClass(Position<T> position)
    {
        Position = position;
    }
}

// 派生类A,继承时传入自身作为泛型参数
public class A : BaseClass<A>
{
    public A(Position<A> position) : base(position)
    {
    }
}

这样定义后,每个派生类在继承BaseClass时都传入自身作为泛型参数,就能保证基类构造函数接收的Position<T>中的T正好对应派生类类型,编译器也会强制约束派生类必须遵循这个规则。

扩展:添加非泛型基类统一接口

如果需要让不同派生类能以非泛型的方式被引用,可以额外定义一个非泛型抽象基类,让泛型基类继承它:

// 非泛型抽象基类,提供统一接口
public abstract class BaseClass
{
    public abstract object GetPosition();
}

// 泛型基类继承非泛型基类
public abstract class BaseClass<T> : BaseClass where T : BaseClass<T>
{
    public Position<T> Position { get; }

    protected BaseClass(Position<T> position)
    {
        Position = position;
    }

    public override object GetPosition()
    {
        return Position;
    }
}

public class A : BaseClass<A>
{
    public A(Position<A> position) : base(position)
    {
    }
}

内容的提问来源于stack exchange,提问作者SNO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 19:44:57