我如何复制从我想要复制的对象继承的对象?

时间:2010-02-15 21:25:23

标签: c# .net vb.net

编写一个asp.net mvc应用程序,我有类似的东西......

Public Class AA
'... has some variables...
End Class

Public Class BB
Inherits AA
Public ExtraVariable As Integer ' just adds another variable and thats it!
End Class

所以,现在在我的程序中,我只想将类型AA的对象复制到BB类型的空变量中?

这样做是有意义的,因为我希望AA类型对象中的所有字段都被复制到新创建的BB类型对象,而BB类型对象中的ExtraVariable我将(将)只为其分配一个值在我自己的时间之后(复制之后)!!

我知道将BB类型复制到AA类型是不合适的,因为会丢失数据!

但是我试图将AA复制到BB,我已经使用了DirectCastCType这样做了,而且我一直“无法施放”错误!!!

注意:我正在使用vb.net(但可以读取c#,没有问题)

5 个答案:

答案 0 :(得分:5)

您似乎对简单分配复制感到困惑。

您可能想要做的是在BB上定义一个构造函数,该构造函数将AA作为参数,并复制值。

答案 1 :(得分:1)

我不认为你的尝试是可能的。对派生类的引用实际上必须引用派生类

的实例

查看Is it possible to assign a base class object to a derived class reference with an explicit typecast in C#?.

以下是获取值的一种方法

        public class AA
        {
            public string name;
        }
        public class BB : AA 
        {
            public BB(AA aa)
            {
                name = aa.name;
            }
        }

答案 2 :(得分:1)

正如anon所说,你可能想要将AA传递给BB的构造函数,在那里你可以复制所有元素:

public class AA
{
//some variables
}

public class BB : AA
{
    public BB(AA aa)
    {
    //Set BBs variables to those in AA
    someVariable= aa.someVariable
    }

    public int SomeExtraProperty{get;set;}
}

但显然你可以使用任何可以重用的继承构造函数,如果合适的话可以重用。

修改

基于上面的一些评论,你也可以这样做:

public class BB : AA
{
    private AA _aa;
    public BB(AA aa)
    {
    //Set BBs variables to those in AA
    _aa=aa;
    }

    public int SomeExtraProperty{get;set;}

    //override inherted members and just delegate to the internal object
    public override int SomeMethod()
    {
       return _aa.SomeMethod();
    }
}

或者可能去Decorator Pattern

答案 3 :(得分:0)

您似乎错误地理解了继承概念。

当您将BB复制到AA时,您不会错过任何数据,因为如果再次将其投射到BB,您可以获取数据。

AA不能直接施放到BB,因为AA不是BB。如果你愿意,你可以进行自定义演员表,你可以指定演员阵容的方式。

但是,这样做不会非常直观,最好是“手工”地设置价值:

bb.Value1 = aa.Value1
bb.Value2 = aa.Value2
bb.Value3 = aa.Value3

没什么不对的。

答案 4 :(得分:0)

您可能希望查看一些关于对象克隆的好帖子,例如Deep cloning objects,但人们已经提到的有关手动复制的内容可能是您从一种类型复制到另一种类型的最佳选择

你的问题似乎在你对继承和铸造的理解上。在施法时要记住的事情是你可以轻松地将其转换为更简单的类型,反之亦然是非常棘手的,并且不可能通过简单的转换

与班级:

public class BaseObject 
{

}

public class InheritedObject : BaseObject
{

}

public class BaseObjectConsumer()
{
    Consumer(BaseObject base);
}

public class InheritedObjectConsumer()
{

}

应考虑以下事项:

InheritedObject io = new InheritedObject();
BaseObject bo = new BaseObject();

BaseObjectConsumer(io); //this is possible as the InheritedObject is being 'viewed' as a BaseObject

InheritedObjectConsumer(bo); //Not as simple, as the Base object is not necessarily an Inherited object, so we can't cast 'up'