1

首先,我有这样的事情:

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));

那么字典将充满Parent's,而不是Children1和Children2。有没有办法在不知道对象的特定类型的情况下调用被键入为其父类型的对象的构造函数?

4

2 回答 2

5

一种方法是在对象上实现ICloneable接口,并让每个实例克隆自己。

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.

于 2012-08-13T18:36:38.713 回答
0

您可以向父类添加一个克隆方法,该方法在每个子类中被覆盖。这将允许你打电话

dictionaryOfCopies.Add(p, p.Clone());
于 2012-08-13T18:37:40.520 回答