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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

SuperDog наследует поле Name, да.

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 9

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

Ответ 10

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

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 для полей int в Bar в общей сложности 24.

Ответ 11

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

Ответ 12

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

Ответ 13

Частные члены могут быть видны внутри производного класса:

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 в этот поток при MSDN.

Ответ 14

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

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