首先,我有这样的事情:

class Parent
{

    int x;

    public Parent(int _x)
    {
        x = _x
    }
}

class Child1: Parent
{
    int y;

    public Child1(int _y):base(_y)
    {
        y=_y;
    }
}

class Child2: Parent
{
    int z;

    public Child2(int _z):base(_z)
    {
        z=_z;
    }
}


一个简单的父子层次结构。然后,我有一个实际上充满了Child1和Child2的列表。我想制作列表中每个对象的副本,并希望制作一个新的副本作为开始。

但是,如果我这样做:

foreach(Parent p in list)
dictionaryOfCopies.Add(p, new Parent(p.x));


则字典将充满家长的字典,而不是满满的Children1和Children2。有没有一种方法可以在不知道对象的特定类型的情况下调用作为其父类型键入的对象的构造函数?

最佳答案

一种方法是在对象上实现ICloneable interface,然后让每个实例克隆自己。

class Parent : ICloneable
{
    int x;
    public Parent(int _x)
    {
        x = _x
    }

    public virtual object Clone()
    {
        return new Parent(x);
    }
}

class Child1 : Parent
{
    int y;

    public Child1(int _y) : base(_y)
    {
        y = _y;
    }

    public override object Clone()
    {
        return new Child1(y);
    }
}

class Child2 : Parent
{
    int z;

    public Child2(int _z) : base(_z)
    {
        z = _z;
    }

    public override object Clone()
    {
        return new Child2(z);
    }
}


然后,您将像这样使用它:

foreach(Parent p in list)
{
    dictionaryOfCopies.Add(p, p.Clone() as Parent);
}




作为魔鬼的拥护者,我对ICloneable接口的批评之一是它不是类型安全的。如果您觉得这很讨厌,您仍然可以采用相同的想法,但是可以实现自己的版本的Clone方法,该方法返回Parent而不是object

10-07 21:42