Являются ли частные члены унаследованы в C #?

Просто увидел один учебник, в котором говорилось:

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

Затем было отображено UML, что SuperDog также наследует имя. Я попробовал, но для меня кажется, что наследуются только публичные участники. По крайней мере, я не мог получить доступ к имени, если он не был объявлен публичным.

Производный class имеет доступ к открытым, защищенным, внутренним и защищенным внутренним членам базового classа. Несмотря на то, что производный class наследует частных членов базового classа, он не может получить доступ к этим членам. Тем не менее, все эти частные члены все еще присутствуют в производном classе и могут выполнять ту же работу, что и в базовом classе. Например, предположим, что метод защищенного базового classа обращается к частному полю. Это поле должно присутствовать в производном classе, чтобы метод унаследованного базового classа работал правильно.

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

Так, технически, да, но практически нет.

Все из базового classа наследуется к производному classу. члены, помеченные как закрытые, недоступны для производных classов для цели целостности, если вам нужно сделать их доступными в производном classе, отметьте их членами как защищенные.

Существуют различные уровни доступности участников в контексте наследования.

public : все публичные члены базового classа доступны в производном classе и экземплярах производного classа.

protected : все защищенные члены базового classа доступны в производном classе, а не в экземплярах производного classа.

protected internal : все защищенные внутренние элементы базового classа доступны в производном classе и экземплярах производного classа, созданных в одной и той же сборке.

internal : все внутренние члены базового classа доступны в производном classе и экземплярах производного classа внутри одной и той же сборки.

private : никакие частные члены базового classа не доступны в производном classе и экземплярах производного classа.

«Да», «SuperDog» наследует поле «Имя».

SuperDog не будет иметь доступ к полю, хотя, поэтому практического использования (насколько это касается SuperDog) практически нет.

Да, хотя наследники не могут получить доступ к этому члену.

Если вы с этим им сможете получить доступ, объявите его защищенным .

Нет, это не так.

protected модификатор может сделать поля доступными для производных classов, но это обычно считается плохой идеей с точки зрения обслуживания. Вместо этого вы должны использовать защищенные свойства.

Элемент в базовом classе должен быть, по крайней мере, защищен, чтобы он мог быть виден в производном classе.

попробуйте ключевое слово protected, а не public / private:

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

Вместо этого сделайте имя protected или public , это будет доступно. Частные члены недоступны из производных classов

Частные члены недоступны для потомков classа.

Я не уверен в всех модификаторах доступа, но в большинстве базовых доступны только общедоступные и защищенные члены.

Да, Наследуются. Но вы не можете получить к ним доступ, поскольку они являются частными :).

Как утверждают другие, частные члены наследуются. Членский доступ – это другой предмет, но не полностью не связанный с наследованием. Важно понимать, что все члены наследуются независимо от их модификатора доступа, поскольку он влияет на размеры подclassов. Рассмотрим следующий код.

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

Foo будет потреблять 16 байтов в куче. 4 для синхроблока, 4 для информации о типе (таблица методов) и 4 для каждой переменной int в общей сложности 12. Bar , с другой стороны, будет потреблять 24 байта. 4 для синхроблока, 4 для информации о типе (таблица методов), 4 для каждого из полей int унаследованных от Foo , и 4 для каждого поля в Bar в общей сложности 24.

Да, но они недоступны, поэтому, глядя на него, вы можете честно сказать, что они не унаследованы. Но да, они действительно

Люди это сказали, но вот пример того, зачем вам нужны частные поля в производном classе:

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

Частные члены могут быть видны внутри производного classа: (Если подclass вложен в базовый class)

 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!"; } } } 

Кредит для примера идет на KodefuGuru в этом streamе в MSDN .

  • можно ли вызвать переопределенный метод из родительской структуры в golang?
  • Наследование backbone.js
  • Переопределение частных методов в Java
  • Почему мой открытый class не может расширить внутренний class?
  • Наследование: «A» является недоступной базой «B»
  • Статические методы унаследованы в Java?
  • Виртуальные таблицы и макет памяти в нескольких виртуальных наследования
  • Поиск имен в шаблонах C ++
  • Распространение «typedef» из основанного на производный class для «шаблона»
  • Как виртуальное наследование разрешает двусмысленность «бриллиантов» (множественное наследование)?
  • Хорошие причины запретить наследование Java?
  • Давайте будем гением компьютера.