11
votes

C # Membres protégés accessibles via une variable de classe de base

Cela peut sembler plutôt une question de débutant, mais pouvez-vous expliquer pourquoi la méthode der.b () ne peut pas accéder au FOO protégé via une variable de classe de base? Cela me semble bizarre: xxx

merci!


0 commentaires

5 Réponses :


0
votes

Dans le scénario, vous essayez de vouloir utiliser "interne" pour INT FOO.


5 commentaires

Cela ne fonctionnera pas si B est passé une base pas un der.


Je sais que je peux utiliser interne ou même public au lieu de protéger. Mais je veux comprendre pourquoi le protégé se comporte comme décrit dans le poteau.


@Roman: car protégé n'est visible que par la classe dérivée. À l'intérieur du même cas. Mais vous essayez de le regarder d'un exemple différent. Si cela pourrait être fait, protégé serait à peu près inutile.


@Roman - La ragepotato répond que.


Yuriy est correct. Le code que j'ai publié était des ordures. MDR. Je l'ai supprimé. La réponse d'Eric Lippert est correcte, en outre, je dois me demander pourquoi vous voudriez faire cela et ne pas le rendre interne?



4
votes

en B vous essayez d'accéder à un membre protégé d'une autre classe. Le fait que vous sonnez à partir de cette classe est hors de propos. Dans D, vous accédez à un membre protégé de la classe de base de votre classe actuelle. Dans ce contexte, vous pouvez accéder à quelque chose de der et les membres protégés du type, il hérite de.


2 commentaires

+1 Pour une explication, mais je doute toujours pourquoi "le fait que vous hérissez de cette classe est non pertinent"? Est-ce que cela représente des spécifications?


Le fait que vous vous hérissez de cela vous donne accès si quelqu'un initialise un der. Dans ce cas, vous pourriez le jeter à DER, puis accédez à FOO.



2
votes

Mettez simplement, protégé permet d'accéder aux sous-classes.

in: p> xxx pré>

Vous essayez d'accéder à un membre protégé Votre instance de DER n'a pas accès à. Cela ne serait accédé que s'il s'agissait de la classe de base de votre instance actuelle de der (ceci). P>

private void D(Der d) { Foo = d.Foo; } // OK


2 commentaires

Je pense que vous vouliez dire: Void privé D (der d) {foo = d.foo; } Fonctionne bien. Un peu déroutant B / C, vous avez dupliqué la ligne de code.


Woops, ouais je voulais copier le deuxième échantillon de code.



22
votes

Ceci est une question fréquemment posée. Pour déterminer pourquoi cela est illégal, pensez à ce qui pourrait aller mal.

Supposons que vous ayez eu un autre FROB de classe dérivé dérivé de la base. Maintenant, vous passez une instance de FROB à DER.B. Si vous pourrez accéder à Frob.foo de der.b? Non, absolument pas. Frob.foo est protégé; Il ne devrait être accessible que de FRB et de sous-classes de FROB. Der n'est pas FROB et n'est pas une sous-classe de FROB. Il ne permet donc pas d'accéder aux membres protégés de FROB.

Si cela n'est pas clair, consultez mon article sur le sujet:

http://blogs.msdn.com/ericlippert/ Archives / 2005/11/09/491031.aspx


1 commentaires

Merci. C'est clair pour moi maintenant.



3
votes

Vous pouvez contourner cette limitation en déclarant une méthode statique dans la classe de base: xxx


0 commentaires