2015-11-25 4 views
1

Рассмотрим это, пожалуйста:C#: Как построить производный класс из существующего объекта базового класса?

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

Я знаю, как использовать x. Но как я должен использовать tn здесь, чтобы назначить его моему объекту MyTreeNode?

+0

В вашем коде нет объекта TreeNode в MyTreeNode. Вы просто задали класс MyTreeNode для наследования TreeNode и предоставили ему общедоступные методы/реквизиты и использовали частные методы. Это можно получить с помощью base.x. Если вы хотите сохранить объект TreeNode в MyTreeNode, вам нужно создать один из –

+1

. Я предполагаю, что у вас есть экземпляр «TreeNode», и вы хотите создать «MyTreeNode», который является производным от «TreeNode», со всеми теми же значениями в нем , и дополнительное свойство 'x', я прав? –

+0

Ты точно прав Дэнни Чен. Знаете ли вы какое-либо решение? – dghadagh

ответ

2

Почему вы хотите присвоить tnMyTreeNode? Он все это наследует. Если you're планирует создать копию 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; 
} 

Однако, если у вас есть отдельные члены на вашем базовый классе, которые должны быть скопировано это много сложнее, вам придется использовать отражение в этом случае, чтобы иметь доступ к тем частным членам (например, поля).

+0

OMG! Вы хотите сказать, что я должен повторить его для всех свойств базового класса? – dghadagh

+0

Yeap, вам нужно создать совершенно новый экземпляр. – HimBromBeere

1

Как и другие высказанные комментарии, нужен конструктор копирования. Я бы использовал следующий код, чтобы я мог также копировать частные свойства без отражения.

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; 
    } 
+0

О, идея копирования-ctor в базовом классе, чтобы избежать отражения, действительно приятно. +1 для этого – HimBromBeere

+0

Но TreeNode - это базовый класс .NET, и я не могу его модифицировать, чтобы добавить для него конструктор копирования. Могу я? – dghadagh

+1

В этом случае вам нужно создать конструктор в производном классе, как показал вам @HimBromBeere. Здесь http://stackoverflow.com/questions/8631898/c-sharp-inheritance-derived-class-from-base-class[/link] Показывается, как вы это делаете с отражением. –

Смежные вопросы