C#:如何从现有的基类对象构造派生类?

时间:2015-11-25 08:26:42

标签: c# derived construct

请考虑一下:

class MyTreeNode: TreeNode{
   int x;
   public MyTreeNode(TreeNode tn)
   {
      x=1; 
      // Now what to do here with 'tn'???
   }

我知道如何使用x。但是,我应该如何使用tn将其分配给我的MyTreeNode对象?

2 个答案:

答案 0 :(得分:2)

为什么要将tn分配给MyTreeNode?它已经从中继承了。如果您打算创建tn但类型为MyTreeNode的副本,则应创建一个复制构造函数:

int x;
public MyTreeNode(TreeNode tn)
{
    // copy tn´s attributes first
    this.myProp = tn.myProp;
    // ... all the other properties from tn

    // now set the value for x
    this.x = 1; 
}

但是,如果您的基类上也有私人成员必须复制,那么这将更加困难,在这种情况下,您必须使用反射来访问这些私有成员(例如字段)。

答案 1 :(得分:2)

正如其他评论所述,您需要一个复制构造函数。 我会使用以下代码,这样我也可以复制私有属性而不用反射。

class TreeNode
{
    private int myProp; //value type field
    private TreeNode parentNode; //reference type field
    public TreeNode(TreeNode tn) //copy constructor
    {
        //copy all the properties/fields that are value types
        this.myProp = tn.myProp;
        //if you have reference types fields properties you need to create a copy of that instance to it as well
        this.parentNode = new TreeNode(parentNode);
    }
    //You can have other constructors here
}

class MyTreeNode: TreeNode{
   int x;
   public MyTreeNode(TreeNode tn):base(tn) //This calls the copy constructor before assigning x = 1
   {
      x=1; 
   }