繁体   English   中英

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

[英]Are private members inherited in C#?

刚看到一个教程说:

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

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

派生类可以访问基类的public,protected,internal和protected内部成员。 即使派生类继承了基类的私有成员,它也无法访问这些成员。 但是,所有这些私有成员仍然存在于派生类中,并且可以执行与基类本身相同的工作。 例如,假设受保护的基类方法访问私有字段。 该字段必须存在于派生类中,以便继承的基类方法正常工作。

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

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

基类中的所有内容都继承到派生类。 出于完整性目的,标记为private的成员无法访问,如果您需要在派生类中访问它们,请将成员标记为受保护。

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

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

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

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

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

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

SuperDog将继承Name字段,是的。

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

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

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

这个例子的功劳MSDN的这个主题中转到了KodefuGuru

不,他们不是。

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

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

如果你有了它,他们将能够访问它,声明它是受保护的

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

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

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

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

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

尝试关键字protected,而不是public / private:

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

使名称protectedpublic ,可以访问。 无法从派生类访问私有成员

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

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表示从Foo继承的int字段,4表示Barint字段,总共24个。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM