2017-09-02 4 views
0

Je voudrais créer une classe pour l'exemple suivant:Comment faire un champ de l'objet externe accessible en classe derivered

class BaseClass 
{ 
    protected int a; 
} 

class DeriveredClass : BaseClass 
{ 
    protected int ownA; 

    public void CopyFrom(BaseClass b) 
    { 
     ownA = b.a; 
    } 
} 

Mais il semble impossible en raison du niveau de protection. Le problème est que "b" est un objet externe dans la méthode CopyFrom().

Le code exact que je voudrais l'utiliser pour est de créer un objet Singleton avec une possibilité de mise à niveau à l'objet de type dérivé:

class MyLogicBase 
{ 
    private static MyLogicBase s_Instance = new MyLogicBase(); 

    protected MyLogicBase() { } 

    public static MyLogicBase Instance 
    { get { return s_Instance; } } 

    public static Upgrade(MyLogicBase newInstance) 
    { 
     newInstance.UpgradeInstance(s_Instance); 
     s_Instance = newInstance; 
    } 

    protected virtual void UpgradeInstance(MyLogicBase previousInstance) 
    { // To override } 

    protected List<string> m_Database = new List<string>(); 
} 

class MyExtendedLogic : MyLogicBase 
{ 
    public override void UpgradeInstance(MyLogicBase newInstance) 
    { 
     m_Database = newInstance.m_Database; 
    } 

    // Extended logic here 
} 

Répondre

2

Juste déléguer la capacité de la classe de base. Vous avez même la méthode virtuelle UpgradeInstance déclarée dans cette classe.

class MyLogicBase 
{ 
    … 

    public virtual void UpgradeInstance(MyLogicBase newInstance) 
    { 
     m_Database = from.m_Database; 
    } 

    protected List<string> m_Database = new List<string>(); 
} 

class MyExtendedLogic : MyLogicBase 
{ 
    public override void UpgradeInstance(MyLogicBase newInstance) 
    { 
     base.UpgradeInstance(newInstance); 
     … 
    } 

    …  
} 
+0

Bonjour! Merci pour une réponse rapide. Accidentellement, j'ai écrit un exemple de code qui ne montre pas le problème que je voudrais résoudre. Je suis désolé pour mon erreur. Corrigé Le problème est que je voudrais que la classe dérivée se configure en utilisant un objet de classe de base, tandis que les objets de la classe de base restent cachés des autres. –

+0

@KamilKowalewski La solution est toujours la même. La méthode virtuelle 'UpgradeInstance' est le bon endroit où copier le champ' m_Database'. Si, pour une raison quelconque, vous ne voulez pas un comportement commun comme celui-ci dans la classe de base 'UpgradeInstance', déclarez une autre méthode dans ce but. –

+0

Cela le rend un peu plus compliqué que je ne le pensais. Les classes dérivées différentes peuvent utiliser différents champs de classes de base de différentes manières. Mais cela résout mes besoins actuels. Merci! –

0

Si son possible, vous pouvez créer d'autres quelque chose de « méthode protégée » dans votre classe de base comme:

class MyLogicBase { 
    … 
    public virtual void UpgradeInstance(MyLogicBase newInstance) 
    { 
     //to override 
    } 
    protected CopyDatabase(MyLogicBase newInstance) { 
     m_Database = newInstance.m_Database; 
    } 

    protected List<string> m_Database = new List<string>(); } 

class MyExtendedLogic : MyLogicBase 
{ 
    public override void UpgradeInstance(MyLogicBase newInstance) 
    { 
     base.CopyDatabase(newInstance); 
     … 
    } 
    …  
} 

Sinon, vous pouvez essayer d'accéder au champ de protection utilisant la réflexion, peut-être quelque chose le long Accessing a class protected field without modifying original class