我在c中有一个类,它的模板和静态方法类似于
class BClass<T>
{
public static BClass<T> Create()
{
return new BClass<T>();
}
}
从中派生一个类并为基类指定一个模板参数
class DClass : BClass<int> { }
当我试图使用static方法创建d的实例时出现问题
class Program
{
static void Main(string[] args)
{
DClass d = DClass.Create();
}
}
给出编译器错误“无法将类型“test.bclass”隐式转换为“test.dclass”。
添加下面的强制转换会导致运行时强制转换异常。
DClass d = (DClass)DClass.Create();
是否有任何简洁的方法允许静态方法创建派生类的实例?理想情况下,我想要一个c++typedef的等价物,我不想要下面的语法(它确实有效)。
BClass<int> d = DClass.Create();
最佳答案
是的,通过对类型本身进行类型引用,这是可能的。请注意,在.NET世界中,我们谈论的是泛型,而不是模板,它们在工作方式上确实有重要的区别。
class BClass<T, TSelf> where TSelf: BClass<T, TSelf>, new() {
public static TSelf Create() {
return new TSelf();
}
}
class DClass: BClass<int, DClass> {}
class Program {
static void Main(string[] args) {
DClass d = DClass.Create();
}
}