I membri privati ​​sono ereditati in C #?

Ho appena visto un tutorial che dice che:

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

Poi c’è stato un UML che mostra che SuperDog erediterà anche Name. Ho provato ma a me sembra che solo i membri pubblici siano ereditati. Almeno non ho potuto accedere a Nome a meno che non sia stato dichiarato pubblico.

Una class derivata ha accesso ai membri interni pubblici, protetti, interni e protetti di una class base. Anche se una class derivata eredita i membri privati ​​di una class base, non può accedere a quei membri. Tuttavia, tutti i membri privati ​​sono ancora presenti nella class derivata e possono fare lo stesso lavoro che farebbero nella class base stessa. Ad esempio, supponiamo che un metodo di class base protetto acceda a un campo privato. Questo campo deve essere presente nella class derivata affinché il metodo della class base ereditata funzioni correttamente.

Da: http://msdn.microsoft.com/en-us/library/ms173149.aspx

Quindi, tecnicamente, sì, ma praticamente no.

Tutto dalla class base è ereditato dalla class derivata. i membri contrassegnati come privati ​​non sono accessibili alle classi derivate per scopi di integrità, se è necessario renderli accessibili nella class derivata, contrassegnare i membri come protetti.

Vi sono vari livelli di accessibilità dei membri nel contesto dell’ereditarietà.

public : tutti i membri pubblici della class base sono accessibili all’interno della class derivata e alle istanze della class derivata.

protected : tutti i membri protetti della class base sono accessibili all’interno della class derivata e non alle istanze della class derivata.

protected internal : tutti i membri interni protetti della class base sono accessibili all’interno della class derivata e alle istanze di class derivata create all’interno dello stesso assembly.

internal : tutti i membri interni della class base sono accessibili all’interno della class derivata e alle istanze di class derivata all’interno dello stesso assembly.

private : nessun membro privato della class base è accessibile all’interno della class derivata e alle istanze della class derivata.

SuperDog erediterà il campo Nome, sì.

Tuttavia, SuperDog NON avrà accesso al campo, quindi non c’è alcun uso pratico (per quanto riguarda SuperDog).

Sì, anche se gli eredi non possono accedere a quel membro.

Se con quello saranno in grado di accedervi, dichiararlo come protetto .

No, non lo sono.

Il modificatore protected può rendere i campi disponibili per le classi derivate, ma questa è generalmente considerata una ctriggers idea dal punto di vista della manutenzione. Vorresti invece utilizzare le proprietà protette.

Il membro nella class base deve essere almeno protetto in modo che possa essere visibile nella class derivata.

prova la parola chiave protetta, anziché pubblica / privata:

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

Rendi il Nome protected o public invece, che sarà accessibile. I membri privati ​​non sono accessibili dalle classi derivate

I membri privati ​​non sono accessibili ai discendenti di una class.

Non sono sicuro di tutti i modificatori di accesso, ma nella maggior parte dei semplici membri pubblici e protetti sono accessibili.

Sì, sono ereditati. Ma non puoi accedervi dato che sono privati ​​:).

Come altri hanno detto che i membri privati ​​sono ereditati. L’accesso dei membri è un argomento diverso ma non totalmente disgiunto dal punto di vista dell’ereditarietà. È importante capire che tutti i membri sono ereditati, indipendentemente dal loro modificatore di accesso, poiché influenza le dimensioni delle sottoclassi. Considera il seguente codice.

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

Foo consumerà 16 byte nello heap. 4 per il syncblock, 4 per le informazioni sul tipo (tabella dei metodi) e 4 per le variabili int per un totale di 12. La Bar , d’altra parte, consumerà 24 byte. 4 per il syncblock, 4 per le informazioni sul tipo (tabella dei metodi), 4 per i campi int ereditati da Foo e 4 per i campi int in Bar per un totale di 24.

Sì, ma non sono accessibili, quindi guardandolo puoi dire onestamente che non sono ereditati. Ma sì, lo sono davvero

Le persone lo hanno detto, ma ecco un esempio del perché hai bisogno dei campi privati ​​nella class derivata:

 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(); } } 

I membri privati possono essere visibili all’interno di una class derivata: (Se la sottoclass è nidificata all’interno della class 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!"; } } } 

Il credito per l’esempio va a KodefuGuru in questo thread su MSDN .