2009-10-19 92 views
1

我想知道是否可以将基类中的派生类的实例的类型更改为来自同一个基类的另一个派生类。下面我会试着用代码来解释它。在基类中重新创建实例

public class ValueTypeClass 
     { 
      private string _Note; 
      private String _Name; 
      private nodeClass refrenceNode ; 
    //... 
      } 

public class refrenceDBClass : valuetypeclass 
{ 
//... 
} 

public class refrenceFileClass : valuetypeclass 
{ 
//... 
} 

现在每个refrenceNode改变时我想改变实例的基础上,refrenceNode性能

编辑1类型:具有另一类保持细节 现在我这样做refrencedbclass和refrencefileclass,每次refrencenode改变我创建一个新的实例。

public class ValueTypeClass 
      { 
       private string _Note; 
       private String _Name; 
       private nodeClass refrenceNode ; 
       private detailClass detailInfo ; 
     //... 
       } 


public class detailClass 
{ 
//... 
} 
    public class refrenceDBClass : detailClass 
    { 
    //... 
    } 

    public class refrenceFileClass : detailClass 
    { 
    //... 
    } 
+0

读者注意:当继承被封装所取代时,问题发生了显着变化。在阅读答案时考虑到这一点。基于refrencenode的 – 2009-10-19 11:58:05

回答

2

您无法更改托管.NET对象的类型。如果你是封装的对象(在一个包装 - 例如refrenceNode)你可以交换引用,但这是关于它。在某些(有限)情况下,您可能能够序列化/反序列化封装实例,更改进程中的类型(仅适用于基于合同的序列化程序,兼容合同;非常不可能)。你当然不能改变当前实例的类型。


重新编辑;再次,你不能改变你如何公开细节的类型,但通过一些演员,你可以使它工作;含糊其词,如:

public class ValueTypeClass 
{ 
    private string _Note; 
    private String _Name; 
    private nodeClass refrenceNode; 
    public nodeClass ReferenceNode { 
     get {return refrenceNode;} 
     set { 
      if(refrenceNode == value) return; // nop 
      refrenceNode = value; 
      BuildDetailInfo(); 
     } 
    } 
    private detailClass detailInfo; 
    public detailClass DetailInfo {get {return detailInfo;}} 
    private void BuildDetailInfo() { 
     // TODO: decide on the appropriate type (based on refrenceNode) 
     // and recreate detailInfo 
    } 
} 

听起来你也应该利用多态性。如果你正在进行数据绑定,你可以做一些其他的事情(付出相当大的努力)使它更友好,但它不会影响常规代码。

+1

那么,如果你可以运行不安全的代码,你*可以*改变运行时类型。将实例的方法表指针更改为其基本类型的方法表指针。 :) – Joren 2009-10-19 11:52:14

+0

我不寒而栗,邪恶的水平; -p – 2009-10-19 11:56:49

+0

这正是我现在正在做的,我想知道是否有可能没有其他类。现在我知道答案是否定的。谢谢 – Asha 2009-10-19 12:15:30

4

在C#中,实例永远不会改变它的类型。

我不明白你想解决这个问题,但我认为你应该聚合这种类型你想改变,并创建一个新的实例,如果一些值的变化。比如像战略模式。

+0

我将有不同的细节和方法,所以我需要改变实例的类型。 – Asha 2009-10-19 11:41:06