2009-08-29 12 views
0

J'ai une classe qui hérite d'une autre et je veux utiliser l'une des fonctions de classe de base ... mais je rencontre un problème où appeler la fonction de base ne retourne pas la variable membre de la classe héritée comme je avaient espéré.C# Héritage, accès aux membres enfants avec les fonctions de base?

Pour illustrer mon problème, j'ai créé un exemple simplifié. Je m'attendais à ce que cet exemple produise "5" mais il ne le fait pas :) La solution semble être que j'ai besoin de copier la fonction getInt() de myclass1 dans myclass2 aussi ... alors cela fonctionnera, mais cela semble vaincre le point d'hériter de myclass1 (je voulais éviter de dupliquer la fonction dans chaque classe).

class Program 
{ 
    static void Main(string[] args) 
    { 
     myclass2 myclass = new myclass2(); 

     // Expected to output 5, but it actually outputs 0 
     Console.WriteLine(myclass.getInt()); 
    } 
} 

struct s1 
{ 
    public string str; 
    public int num; 
} 

struct s2 
{ 
    public int num; 
    public int num2; 
} 

class myclass1 
{ 
    internal s1 mystruct; 

    internal int getInt() 
    { 
     return mystruct.num; 
    } 
} 

class myclass2 : myclass1 
{ 
    internal new s2 mystruct; 

    internal myclass2() 
    { 
     mystruct.num = 5; 
    } 
} 

Répondre

5

Vous cachez myclass1.mystruct avec myclass2.mystruct. Ce sont deux objets complètement différents.

Vous pouvez redéfinir l'objet en lui affectant virtual dans la classe de base et override dans la sous-classe, mais l'objet doit conserver son type. Vous ne pouvez pas changer le type d'une instance, car ce n'est pas sécurisé. (FIXME) Si vous voulez changer le type de mystruct, pourquoi?

Si vous voulez juste accéder myclass1.mystruct de myclass2, vous pouvez utiliser base.mystruct, je pense.

+0

Oui strager a raison. Au lieu de cela, vous pouvez simplement le protéger dans la classe de base et ne pas déclarer + initialiser un nouveau, juste le définir, comme si son protégé et class2 l'héritait, il devrait avoir accès, je ne pense pas que vous voulez l'interne. – David

+0

Merci les gars - malheureusement, le type de mystruct doit être différent dans les deux classes. Le projet global est un wrapper autour de certaines API C++ et l'API est versionnée avec deux structures différentes représentant la même chose. La version XP de la structure a des contenus différents à la version Vista et mon code doit être agnostique à OS. J'ai essayé de simplifier ce scénario dans l'exemple ci-dessus. Existe-t-il un moyen de faire fonctionner cela sans copier simplement la fonction getInt() dans myclass2? (Il semble qu'il n'y ait aucun intérêt à continuer à hériter à ce stade) –

+0

@DaveUK, Pouvez-vous être plus précis avec votre problème? Chaque «myclass» est-elle un système d'exploitation? N'auriez-vous pas une classe de système d'exploitation "de base" alors plusieurs sous-classes spécifiques au système d'exploitation? – strager

Questions connexes