gpt4 book ai didi

c# - 抽象类实例化

转载 作者:太空狗 更新时间:2023-10-30 00:16:11 25 4
gpt4 key购买 nike

我有一个基本抽象类,其中包含几个扩展和覆盖它的类,但是它们都具有相同的构造函数。现在我从 switch 语句调用每个构造函数:

case 1: return new A(arg1); // arg is int

等,大约 10 节课。有没有一种方法可以使用泛型或委托(delegate)创建一个方法,该方法将采用类名并使用参数实例化该类型?

这会有所帮助,因为如果我对构造函数进行更改,我也必须更改每个实例化。

委托(delegate)是最直接的,但研究表明不建议将构造函数分配给委托(delegate)。

补充:我现在用我的笔记本电脑连接 wifi,而不仅仅是我的手机,所以这里有一些代码。

这是一个现在发生的例子:

switch (new Random().Next(4))
{
case 3:
// classA : baseClass, args{int, bool, otherClass}
return new classA(arg1, arg2, arg3);
case 2:
// classB : baseClass, args{int, bool, otherClass}
return new classB(arg1, arg2, arg3);
case 1:
// classC : baseClass, args{int, bool, otherClass}
return new classC(arg1, arg2, arg3);
case 0:
// classD : baseClass, args{int, bool, otherClass}
return new classD(arg1, arg2, arg3);
default:
continue;
}

我想在 block 的末尾用三个参数调用一个实例化器。

我想到的一个解决方案是制作和实例化类,其工作方式与此类似:

ClassInstantiator inst = new ClassInstantiator(arg1, arg2, arg3);
switch(new Random().Next(4))
{
case 4:
return inst.instantiate<classA>();
...
}

这是否已经内置到语言中,或者有人知道更优雅的解决方案吗?

最佳答案

您可以对泛型类型施加的唯一与构造函数相关的约束是 new() 约束,它需要一个公共(public)无参数构造函数。

你可以使用反射;该示例假定所有相关类型都有一个采用 int 的构造函数,如您的示例所示,并且抽象基类称为 B:

public T CreateInstance<T>(int i) where T : B
{
return (T)Activator.CreateInstance(typeof(T), i);
}

然后你会这样调用它:

A a = CreateInstance<A>(3);

关于c# - 抽象类实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8580371/

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