2009-10-19 7 views
1

Je me demandais s'il est possible de changer le type d'une instance d'une classe dérivée dans sa classe de base en une autre classe dérivée de la même base. Je vais essayer de l'expliquer dans un code.recréer instance dans la classe de base

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

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

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

maintenant chaque fois que le refrenceNode change Je souhaite modifier le type de l'instance en fonction des propriétés de refrenceNode

Edit 1: Maintenant, je fais cela en ayant une autre classe qui maintient le détail de refrencedbclass et refrencefileclass et chaque fois que le refrencenode est changé je crée une nouvelle instance.

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

Note aux lecteurs: la question a changé de façon significative lorsque l'héritage a été remplacé par l'encapsulation. Prenez cela en compte lors de la lecture des réponses. –

Répondre

2

Vous ne pouvez pas modifier le type d'un objet .NET géré. Si vous étiez encapsulant l'objet (dans un wrapper - par exemple refrenceNode) vous pourriez échanger la référence, mais c'est à peu près tout.

Dans certains cas (limités), vous pouvez sérialiser/désérialiser une instance encapsulée, en modifiant le type dans le processus (ne fonctionne que pour les sérialiseurs basés sur des contrats, avec des contrats compatibles, très improbable). Vous certainement ne peut pas changer le type de l'instance en cours.


Re la modification; encore une fois, vous ne pouvez pas changer le type de comment vous exposer les détails, mais avec un certain casting vous pouvez le faire fonctionner; vaguement, quelque chose comme:

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 
    } 
} 

Il semble que vous devriez également utiliser le polymorphisme. Si vous faites des liaisons de données, vous pouvez faire d'autres choses (avec un effort considérable) pour rendre cela plus convivial, mais cela n'affectera pas le code ordinaire.

+1

Eh bien, vous pouvez * changer * le type d'exécution si vous pouvez exécuter un code dangereux. Changez le pointeur de la table de méthode de l'instance en celui de son type de base. :) – Joren

+0

Je frémis à ce niveau de mal ;-p –

+0

c'est exactement ce que je fais maintenant et je me demandais s'il est possible de ne pas avoir d'autres classes ou non. et maintenant je sais que la réponse est non. Je vous remercie – Asha

4

En C#, une instance ne change jamais de type.

Je ne comprends pas le problème que vous voulez résoudre avec ceci, mais je suppose que vous devez agréger ce type que vous voulez changer, et créer une nouvelle instance si certaines valeurs changent. Comme le modèle de stratégie, par exemple.

+0

basé sur le refrencenode Je vais avoir différents détails et méthodes, donc j'ai besoin de changer le type de l'instance. – Asha

Questions connexes