gpt4 book ai didi

c# - 从派生类中的静态方法创建泛型类实例

转载 作者:太空狗 更新时间:2023-10-29 20:02:09 24 4
gpt4 key购买 nike

我在 C# 中有一个类,其模板和静态方法类似于

class BClass<T>
{
public static BClass<T> Create()
{
return new BClass<T>();
}
}

由此我派生了一个类并为基类指定了一个模板参数

class DClass : BClass<int> { }

当我尝试使用静态方法创建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();

最佳答案

看来你要的是DClass成为 BClass<int> 的别名.但这不是你在这里所拥有的。你拥有的是 DClass 源自 BClass<int> .因此调用DClass.Create();创建一个 BClass<int> , 这不是 DClass (恰恰相反)。

这可能会使它更清楚。假设你有这个层次结构:

class Rectangle {
static Rectangle Create() {
return new Rectangle();
}
}

class Square : Rectangle { }

// code elsewhere
var shape = Square.Create(); // you might want this to return a square,
// but it's just going to return a rectangle

获得类似您想要的功能的一个选项可能是定义您的 Create像这样的方法:

static TClass Create<TClass>() where TClass : BClass<T>, new() {
return new TClass();
}

// code elsewhere
var shape = DClass.Create<DClass>();

虽然这有点困惑(并且还要求您为 DClass 编写无参数构造函数)。如果您坚决使用 Create实例化对象的方法,请考虑为其编写一个工厂类。

关于c# - 从派生类中的静态方法创建泛型类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2920759/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com