如何解决不能从父母到子女的问题

时间:2012-05-01 14:51:52

标签: c#

我已经了解了为什么你不能将父母施放给孩子的原因:你不能将动物施放给DOG;它可能是一个CAT。

但这是我的问题:

我从数据层收到一个包含50个属性的数据对象。现在我创建了这个对象的子对象,只有一个属性。

在我的函数中,我希望用50个基础对象填充我的对象的所有51个属性,以及另外一个。

所以我正在寻找一种方法将父对象的50个属性“复制”到子对象。

有办法吗?

4 个答案:

答案 0 :(得分:2)

这很可能是您不想使用继承的时候。要做到这一点,新的Type不会从任何东西继承而且有两个属性,一个属于旧类型(你当前正考虑用作父类),另一个属于新数据。

答案 1 :(得分:1)

您可以使用复制构造函数基于父对象创建新的子对象。您甚至可以在父类中创建一个复制构造函数,并在创建新子元素时使用该构造函数。

public Parent (Parent other)
{
   //copy other.Properties to this.Properties
}


public Child (Parent other) : base(other)
{
   //populate property 51
}

public Child (Child other) : base(other)
{
   //copy property 51
}

如果您要将属性复制到现有实例,则可能需要为此创建单独的方法。

public void Assimilate(Parent other)
{
   //copy parent's properties
}

public void Assimilate(Child other)
{
   //copy child's properties
}

答案 2 :(得分:1)

基于复制构造函数,通用解决方案有两种方法(即不涉及每个属性的手动副本和相关的维护噩梦):

  1. 使用反射制作浅色副本。 Example here

  2. 使用序列化进行深层复制(将基础对象序列化为内存流,然后将其序列化为派生对象)。 example here的第一部分讨论了序列化(文章讨论了这两种方法)。

答案 3 :(得分:0)

这是你问题的一面(复制构造函数的答案似乎是一种可行的方法),但请注意你可以从基类转换为子类,但它是只是不能保证成功就像从子类投射到基础。见下文:

public class Base
{
}

public class Child1 : Base
{
}

public class Child2 : Base
{
}

main()
{
    Child1 ch1 = new Child1();
    Child2 ch2 = new Child2();

    Base myBase;
    myBase = ch1; // Always succeeds, no cast required
    myBase = ch2; // Always succeeds, no cast required

    // myBase contains ch2, of type Child2
    Child1 tmp1;
    Child2 tmp2;

    tmp2 = (Child2)myBase;   // succeeds, but dangerous
    tmp2 = mybase as Child2; // succeeds, but safer, since "as" operator returns null if the cast is invalid
    tmp1 = (Child1)myBase;   // throws a ClassCastException and tmp1 is still unassigned
    tmp1 = myBase as Child1; // tmp1 is now null, no exception thrown

    if(myBase is Child1)     
    {
        tmp1 = (Child1)myBase; // safe now, as the conditional has said it's true
    }
    if(myBase is Child2)     // test to see if the object is the sub-class or not
    {
        tmp2 = (Child2)myBase; // safe now, as the conditional has said it's true
    } 
}

我希望这是有道理的。如果你只是盲目地施展它,它可以抛出异常。如果您使用as关键字,它将成功,或返回null。或者您可以在分配之前使用if语句和is关键字对其进行“测试”。