我已经读过你不能把父母投给孩子的原因:你不能把动物投给狗;它可能是一只猫。
但这是我的问题:
我从我的数据层收到一个具有 50 个属性的数据对象。现在我创建了这个对象的一个子对象,只有一个属性。
在我的函数中,我想用基础对象的 50 个和一个额外的来填充对象的所有 51 个属性。
所以我正在寻找一种将父对象的 50 个属性“复制”到子对象的方法。
有没有办法做到这一点?
我已经读过你不能把父母投给孩子的原因:你不能把动物投给狗;它可能是一只猫。
但这是我的问题:
我从我的数据层收到一个具有 50 个属性的数据对象。现在我创建了这个对象的一个子对象,只有一个属性。
在我的函数中,我想用基础对象的 50 个和一个额外的来填充对象的所有 51 个属性。
所以我正在寻找一种将父对象的 50 个属性“复制”到子对象的方法。
有没有办法做到这一点?
这很可能是您不想使用继承的时候。要做到这一点,新的 Type 不会从任何东西继承,并且有两个属性,一个是旧类型(您当前正在考虑用作父类型),另一个是新数据。
您可以使用复制构造函数来基于父对象创建新的子对象。您甚至可以在父类中创建一个复制构造函数,并在创建新子类时使用该构造函数。
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
}
这是您问题的一面(复制构造函数的答案似乎是一种可能的方法),但请注意,您可以从基类转换为子类,但不能保证像从子类转换一样成功-类到一个基地。见下文:
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。is
或者您可以在分配它之前使用 if 语句和关键字预先“测试”它。