我有一个基类Number
,它由类One
,Two
和Three
继承。
我有一个属性
public Number SomeNumber{get;set;}
最初,我已将SomeNumber
设置为One
,Two
或Three
(随机生成值)。
稍后,我想将SomeNumber
设置为旧类的相同类型的新类。这可能吗?如果是这样,怎么样?
初始化时,SomeNumber
设置为One
稍后在该计划中,我想将SomeNumber
设置为One
的新实例。
答案 0 :(得分:7)
我会在Number上添加一个抽象的方法CreateInstance,并在所有具体的子类中实现它。
abstract class Number
{
abstract Number CreateInstance();
}
class One : Number
{
override Number CreateInstance()
{
return new One();
}
}
“稍后”
Number newNumber = SomeNumber.CreateInstance();
它不需要反射,因此是类型安全的,如果构造函数需要一些参数,它将支持参数。
答案 1 :(得分:1)
SomeNumber = (Number)Activator.CreateInstance(SomeNumber.GetType());
对于参数,您必须按如下方式填写参数:
public partial class Form1 : Form
{
public Number SomeNumber { get; set; }
public Form1()
{
InitializeComponent();
SomeNumber = new One();
SomeNumber = (Number)Activator.CreateInstance(SomeNumber.GetType(), new[] {1});
}
}
public class Number
{
}
public class One : Number
{
public One()
{
}
public One(Object a)
{
}
}
Stefan上面的帖子是一种更好的实现方法。 另一种选择是创建一个对象工厂