C#:如何从现有基础 class 对象构造派生 class?
C#: How to construct a derived class from an existing base class object?
请考虑一下:
class MyTreeNode: TreeNode{
int x;
public MyTreeNode(TreeNode tn)
{
x=1;
// Now what to do here with 'tn'???
}
我知道如何使用x
。但是我应该如何在这里使用 tn
将其分配给我的 MyTreeNode
对象?
为什么要将 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;
}
但是,如果您的 base-class 上也有私有成员,则必须复制这些成员,这要困难得多,在这种情况下,您必须使用反射才能访问这些私有成员(例如字段)。
正如其他评论所述,您需要一个复制构造函数。
我会使用下面的代码,这样我也可以在没有反射的情况下复制私有属性。
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;
}
请考虑一下:
class MyTreeNode: TreeNode{
int x;
public MyTreeNode(TreeNode tn)
{
x=1;
// Now what to do here with 'tn'???
}
我知道如何使用x
。但是我应该如何在这里使用 tn
将其分配给我的 MyTreeNode
对象?
为什么要将 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;
}
但是,如果您的 base-class 上也有私有成员,则必须复制这些成员,这要困难得多,在这种情况下,您必须使用反射才能访问这些私有成员(例如字段)。
正如其他评论所述,您需要一个复制构造函数。 我会使用下面的代码,这样我也可以在没有反射的情况下复制私有属性。
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;
}