Sont privés de membres hérités en C#?
Juste vu un tutoriel en disant que:
Class Dog
{
private string Name;
}
Class SuperDog:Dog
{
private string Mood;
}
Puis il y a eu une UML afficher les SuperDog héritera de Nom. J'ai essayé mais il me semble que seuls les membres du public sont héritées. Au moins, je ne pouvais pas accéder à ce Nom si elle a été déclarée comme public.
- Si elles l'étaient, ce serait le point de
protected
? - Goodman: je suppose que vous voulez dire "s'ils étaient accessibles" et pas "si elles ont été héritées".
- Bon point.
Vous devez vous connecter pour publier un commentaire.
À partir de: http://msdn.microsoft.com/en-us/library/ms173149.aspx
Donc, techniquement, oui, mais en pratique, aucun.
derivedType.GetField("f", BindingFlags.Instance | BindingFlags.NonPublic)
, vous n'obtiendrez rien en retour, même si c'est techniquement censé renvoyer tous les membres hérités. Même si, techniquement, doit existent, sous le capot, toutes les parties pertinentes de l'exécution de la traiter comme si elle n'existe pas dans la réalité.Il existe différents niveaux de membres de l'accessibilité dans le contexte de l'héritage.
public
: tous les membres publics de la classe de base sont accessibles au sein de la dérivée de la classe et pour le cas de la dérivée de la classe.protected
: tous les membres protégés de la classe de base sont accessibles au sein de la dérivée de la classe et de ne pas le cas de la dérivée de la classe.protected internal
: tous protégés par des membres internes de la classe de base sont accessibles au sein de la dérivée de la classe et pour le cas de la dérivée de la classe créée au sein de la même assemblée.internal
: tous les membres de la classe de base sont accessibles au sein de la dérivée de la classe et pour le cas de la dérivée de la classe au sein de la même assemblée.private
: aucun des membres privés de la classe de base sont accessibles au sein de la dérivée de la classe et pour le cas de la dérivée de la classe.protected internal
est éteint.protected internal
de la classe de base des membres sont visibles pour toutes les classes dérivées de et sont exposés à toutes les classes au sein de la même assemblée que la base.SuperDog héritera du Nom de domaine, oui.
SuperDog sera PAS avoir accès au terrain, donc il n'est pas pratique d'utilisation (autant que SuperDog est concerné).
Privé des membres de la peut être visible à l'intérieur d'une classe dérivée: (Si le sous-classe est imbriquée dans la classe de base)
De crédit pour l'exemple va à KodefuGuru dans ce fil de discussion MSDN à l'adresse.
Non, ils ne le sont pas.
La
protected
modificateur peut faire des champs disponibles pour les classes dérivées, mais cela est généralement considéré comme une mauvaise idée à partir d'un point de vue de l'entretien. Vous voulez les utiliser immeubles protégés au lieu.this
modificateur, ce qui signifie que le code doit être en cours d'exécution à l'intérieur de la classe. En outre, si vous avez jetéthis
à une autre classe (même son propre super-classe), vous ne pourrez accéder qu'aux éléments publics, ne sont pas protégés ou privés.class X
a privé membreA
;class Y
dérive declass X
.typeof(Y).GetField("A", Instance | NonPublic | FlattenHierarchy)
renvoie la valeur null....typeof(Y).BaseType.GetField("A", Instance | NonPublic | FlattenHierarchy)
renvoie une FieldInfo pour A. Donc, encore une fois, -n-, les champs ne sont pas héritées aussi loin que l' .NET Framework est concerné. Ils sont encore tout -seul - dans la classe de base.Oui, bien que héritiers ne peuvent pas accéder à que membre.
Si vous avec qui ils seront en mesure d'y accéder, de le déclarer comme protégé.
Le membre dans la classe de base doit être au moins protégé de sorte qu'il peut être visible dans la classe dérivée.
essayer le mot-clé protégée, au lieu de public/privé:
http://msdn.microsoft.com/en-us/library/bcd5672a(SV.71).aspx
Faire un Nom
protected
oupublic
à la place, qui sera accessible. Les membres privés ne sont pas accessibles depuis les classes dérivéesMembres privés ne sont pas accessibles aux descendants d'une classe.
Je ne suis pas sûr de tous les modificateurs d'accès, mais à la base de la population et des membres protégés sont accessibles.
Oui, Le sont héritées.
Mais vous ne pouvez pas y accéder comme ils sont en privé :).
Comme d'autres l'ont dit les membres privés sont héritées. L'accès des membres est un autre sujet, mais pas totalement disjoints d'un héritage de la perspective. Il est important de comprendre que tous les membres sont héréditaires, indépendamment de leur modificateur d'accès car il les effets de la taille des sous-classes. Considérons le code suivant.
Foo
consomment de 16 octets sur le tas. 4 pour la syncblock, 4 pour les informations de type (méthode de la table), et 4 pour chaqueint
variables pour un total de 12.Bar
, d'autre part, consomment de 24 octets. 4 pour la syncblock, 4 pour les informations de type (méthode de la table), 4 pour laint
champs hérités deFoo
, et 4 pour chaqueint
champs dansBar
pour un total de 24.Personnes l'ont dit, mais voici un exemple de pourquoi vous avez besoin de les champs privés de la classe dérivée:
Oui, mais ils ne sont pas accessibles, donc les regardant, vous pouvez honnêtement dire qu'ils ne sont pas héritées. Mais oui ils sont vraiment