私有成员是否继承在C#中?

时间:2010-06-01 14:55:31

标签: c# inheritance private

刚看过一个教程说:

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

然后有一个UML显示SuperDog也会继承Name。我试过但似乎只有公共成员才能继承。至少我无法访问Name,除非它被声明为public。

15 个答案:

答案 0 :(得分:102)

  

派生类可以访问   公共,受保护,内部和   保护基地的内部成员   类。即使是派生类   继承基础的私有成员   class,它无法访问这些成员。   但是,所有这些私人成员都是   仍存在于派生类中   他们可以做同样的工作   基类本身。例如,   假设一个受保护的基类   方法访问私有字段。那   字段必须存在于派生中   class为了继承的基础   类方法正常工作。

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

所以,技术上,是的,但实际上,没有。

答案 1 :(得分:43)

  

基类的一切都是   继承到派生类。成员   标记为私人无法访问   为完整性目的而派生的类,   你需要制作它们吗?   在派生类中可访问,标记   成员受保护。

在继承的上下文中有不同级别的成员可访问性。

public:基类的所有公共成员都可以在derived-class和derived-class的实例中访问。

protected:基类的所有受保护成员都可以在派生类中访问,而不是派生类的实例。

protected internal:所有受保护的基类内部成员都可以在derived-class和同一程序集中创建的derived-class实例中访问。

internal:基类的所有内部成员都可以在derived-class和同一程序集中的derived-class实例中访问。

private:在派生类和派生类的实例中,不能访问基类的私有成员。

答案 2 :(得分:18)

SuperDog将继承Name字段,是的。

SuperDog NOT 可以访问该字段,因此没有实际用途(就SuperDog而言)。

答案 3 :(得分:2)

私有成员可以在派生类中可见:(如果子类嵌套在基类中)

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中的this thread at MSDN

答案 4 :(得分:1)

不,他们不是。

protected修饰符可以使字段可用于派生类,但从维护角度来看,这通常被认为是一个坏主意。您想要使用受保护的属性。

答案 5 :(得分:1)

是的,虽然继承人无法访问该成员。

如果您能够访问它,请将其声明为受保护

答案 6 :(得分:0)

班级的后代无法访问私人会员。

我不确定所有的访问修饰符,但最基本的只有公共和受保护的成员可以访问。

答案 7 :(得分:0)

基类中的成员必须至少受到保护,以便在派生类中可见。

答案 8 :(得分:0)

尝试使用关键字protected,而不是公开/私有:

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

答案 9 :(得分:0)

改为命名protectedpublic,即可访问。无法从派生类访问私有成员

答案 10 :(得分:0)

正如其他人所说,私人成员是继承的。成员访问权限是一个不同的主题,但并不完全脱离继承的角度。重要的是要理解所有成员都是继承的,无论其访问修饰符如何,因为它会影响子类的大小。请考虑以下代码。

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 :(得分:0)

是的,是继承的。 但你无法访问它们,因为它们是私有的:)。

答案 12 :(得分:0)

是的,但是它们无法访问,所以看着它你可以诚实地说它们不是遗传的。但是,他们确实是

答案 13 :(得分:0)

人们已经说过了,但是这里有一个例子,说明为什么你需要派生类中的私有字段:

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

答案 14 :(得分:-2)

您是正确的,派生类无法访问private成员。

您应该成为成员protected或使用基类的公共方法访问它们。

class Player
{
    protected string name;
    protected string type;

    public Player(string name,string type)
    {
        Console.WriteLine("Player"+ this);
        this.name = name;
        this.type = type;
    }
   public void introduce()
    {
        Console.WriteLine("I am " + this.name + " I'm a " + this.type);
    }
}

class Wizard : Player
{
    public Wizard(string name,string type):base(name,type)
    {
        Console.WriteLine("Wizard"+ this);
      
    }
    public void Play()
    {
        //protected modifier made the name field available;
        Console.WriteLine("Yipeeee!!!!!"+ " "+ this.name);
        
        //on the other hand
        // we can make the name and type fields as private in the base class and access them using the public methods of the base class
        introduce();

    }