继承:只有字段和方法?

Moc*_*cco 1 .net c#

读一本书它说派生类继承了所有的领域和方法......但是属性呢?

Eri*_*ert 8

这里的答案似乎有相当多的错误信息.有关正确答案,请参阅C#规范的第3.4节,我在此为您重现:

类型的成员要么在类型声明中声明,要么从类型的基类继承.当类型继承自基类时,基类的所有成员(实例构造函数,析构函数和静态构造函数除外)都将成为派生类型的成员.声明的基类成员可访问性不控制成员是否继承 - 继承扩展到任何不是实例构造函数,静态构造函数或析构函数的成员.但是,可能无法在派生类型中访问继承的成员,因为它声明了可访问性,或者因为它在类型本身中被声明隐藏.

我在相关部分增加了一些重点.关键是除了构造函数和析构函数之外,所有成员都是继承的.成员是继承的,无论它们是方法,字段,属性,事件还是索引器.无论是公共的,私人的还是受保护的,成员都是继承的.成员是继承的,无论它们是静态的,实例的,虚拟的还是抽象的.所有成员都是继承的.


Rob*_*ine 5

派生类继承所有方法字段,也是属性,虽然私有方法,字段和属性通常不能从派生类直接访问或可见,除非它嵌套在它的超类(父类)中.但是,构造函数和终结器不是继承的,所以当你派生一个类型时,你总是需要编写对象初始化所需的任何构造函数,即使它只是调用基类的构造函数.

但是,通常认为将字段设置为私有并允许在必要时通过属性访问它们是一种好的做法.这样,它允许您(基类的作者)确信您可以控制类状态(其字段的值)可以更改的方式.

为了说明您对属性的疑问:

public class Person 
{
    public Name { get; set; }
    public void Greet()
    {
      Console.WriteLine("Hello");
    }
}

public class Child : Person
{
   public Nickname { get; set;}
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,派生类Child 除了派生属性(Name)及其派生方法(Greet)之外还有一个昵称(属性).

  • @Ocelot20:静态和私有成员肯定是继承的!试试吧!B级{private int x; private static void M(int y){} class D:B {void N(){M(this.x); 如果M和x不是由B从D继承的,那怎么合法?**构造函数和析构函数**是不继承的.私有和静态肯定是. (5认同)
  • @ Ocelot20:你输错了.**D在B内.**但这实际上是无关紧要的.让我们考虑你的情况,其中D不在B内.**如果成员x和M没有继承**,为什么会出现可访问性错误?*原因*您获得可访问性错误是*因为*成员是继承的!如果成员没有继承,那么*编译器如何知道检查哪些成员不可访问?* (3认同)
  • @ Ocelot20:这样看.假设你有P {private int x; } class Q {Console.WriteLine(x); }.P和Q没有关系,所以x不是继承的.错误不是"*x是私有*".错误是"*没有任何名为x*的成员".事实上,私有成员是继承的,这使得可以在B类/ D类场景中首先生成可访问性错误.可访问性错误是*证据*私有成员是继承的; 为什么你认为它是*不是*继承的证据? (2认同)