2009-10-19 89 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