web-dev-qa-db-fra.com

Les membres privés sont-ils hérités en C #?

Je viens de voir un tutoriel disant que:

Class Dog
{
  private string Name;
}
Class SuperDog:Dog
{
 private string Mood;
}

Ensuite, il y avait un UML indiquant que SuperDog hériterait également de Name. J'ai essayé mais il me semble que seuls les membres du public sont hérités. Au moins, je ne pouvais pas accéder à Name à moins qu'il ne soit déclaré public.

57
Petr

Une classe dérivée a accès aux membres publics, protégés, internes et internes protégés d'une classe de base. Même si une classe dérivée hérite des membres privés d'une classe de base, elle ne peut pas accéder à ces membres. Cependant, tous ces membres privés sont toujours présents dans la classe dérivée et peuvent faire le même travail qu'ils feraient dans la classe de base elle-même. Par exemple, supposons qu'une méthode de classe de base protégée accède à un champ privé. Ce champ doit être présent dans la classe dérivée pour que la méthode de classe de base héritée fonctionne correctement.

De: http://msdn.Microsoft.com/en-us/library/ms173149.aspx

Donc, techniquement, oui, mais pratiquement non.

102
Martin Eve

Tout de la classe de base est hérité de la classe dérivée. les membres marqués privés ne sont pas accessibles aux classes dérivées à des fins d'intégrité, si vous devez les rendre accessibles dans la classe dérivée, marquez les membres comme protégés.

Il existe différents niveaux d'accessibilité des membres dans le contexte de l'héritage.

public: tous les membres publics de la classe de base sont accessibles au sein de la classe dérivée et aux instances de la classe dérivée.

protected: tous les membres protégés de la classe de base sont accessibles dans la classe dérivée et non aux instances de la classe dérivée.

protected internal: tous les membres internes protégés de la classe de base sont accessibles au sein de la classe dérivée et aux instances de la classe dérivée créées au sein du même assembly.

internal: tous les membres internes de la classe de base sont accessibles dans la classe dérivée et aux instances de la classe dérivée dans le même assembly.

private: aucun membre privé de la classe de base n'est accessible au sein de la classe dérivée et aux instances de la classe dérivée.

44

SuperDog héritera du champ Nom, oui.

SuperDog PAS aura cependant accès au champ, donc il n'y a pas d'utilisation pratique (en ce qui concerne SuperDog).

18
Justin Niessner

Les membres privés peuvent être visibles dans une classe dérivée: (si la sous-classe est imbriquée dans la classe de base)

public class Person
{
    private string message;

    public override string ToString()
    {
        return message;
    }

    public static Person CreateEmployee()
    {
        return new Employee();
    }

    class Employee : Person
    {
        public Employee()
        {
            this.message = "I inherit private members!";
        }
    }
}

Le crédit pour l'exemple va à KodefuGur in ce fil sur MSDN .

2
Jørgen Fogh

Oui, bien que les héritiers ne puissent pas accéder ce membre.

Si vous avec cela, ils pourront y accéder, déclarez-le comme protégé.

1
Poni

Non, ils ne le sont pas.

Le modificateur protected peut rendre les champs disponibles pour les classes dérivées, mais cela est généralement considéré comme une mauvaise idée du point de vue de la maintenance. Vous souhaitez plutôt utiliser des propriétés protégées.

1
Warren Rumak

Oui, ils sont hérités. Mais vous ne pouvez pas y accéder car ils sont privés :).

0
Ram

Les membres 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 au fond, seuls les membres publics et protégés sont accessibles.

0
Matt Ellen

Le membre de la classe de base doit être au moins protégé pour être visible dans la classe dérivée.

0
Petar Minchev

essayez le mot-clé protégé, au lieu de public/privé:

http://msdn.Microsoft.com/en-us/library/bcd5672a (VS.71) .aspx

0
dm76

Rendez Nom protected ou public à la place, ce sera accessible. Les membres privés ne sont pas accessibles à partir des classes dérivées

0
Greg Olmstead

Les gens l'ont dit, mais voici un exemple de la raison pour laquelle vous avez besoin des champs privés dans la classe dérivée:

class Program
{
    static void Main(string[] args)
    {
        var r = new Random();

        foreach(var i in Enumerable.Range(0,100))            
            new Derived(r).Printer();            

        Console.Read();
    }
}

public class Base
{
    private Random r;
    public Base(Random r) { this.r = r; }

    protected void Print()
    {
        Console.WriteLine(r.Next(1, 10000));
    }
}

public class Derived : Base
{
    public Derived(Random r) : base(r) { }
    public void Printer()
    {
        base.Print();
    }
}
0
Jonesopolis

Comme d'autres l'ont dit, les membres privés sont hérités. L'accès des membres est un sujet différent mais pas totalement disjoint du point de vue de l'héritage. Il est important de comprendre que tous les membres sont hérités quel que soit leur modificateur d'accès car cela affecte les tailles des sous-classes. Considérez le code suivant.

public class Foo
{
  private int a;
  public int b;
}

public class Bar : Foo
{
  private int c;
  public int d;
}

Foo consommera 16 octets sur le tas. 4 pour le syncblock, 4 pour les informations de type (table des méthodes) et 4 pour les variables int pour un total de 12. Bar, en revanche, consommera 24 octets. 4 pour le syncblock, 4 pour les informations de type (table des méthodes), 4 pour les champs int hérités de Foo et 4 pour les champs int dans Bar pour un total de 24.

0
Brian Gideon

Oui, mais ils ne sont pas accessibles, donc en le regardant, vous pouvez honnêtement dire qu'ils ne sont pas hérités. Mais oui, ils le sont vraiment

0
Spooks