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
相关产品推荐
相关产品推荐

