如何访问附加到派生类的值?

Joe*_*Joe 1 c# inheritance

我有一个叫做的课Animal.对于任何给定的动物a,a.number_of_legs应该是4.

我有一个叫做Human继承自的类Animal.对于任何给定的人h,h.number_of_legs应该是2.

我该如何设置number_of_legs房产?


这是我到目前为止所拥有的:

 class Animal {
      int number_of_legs = 4;
 }

 class Human : Animal {
      int number_of_legs = 2;
 }
Run Code Online (Sandbox Code Playgroud)

但是,如果我采取一些任意动物,并询问它有多少腿,答案总是2:

 Animal x = new Animal();
 Animal y = new Human();
 x.number_of_legs // --> 4
 y.number_of_legs // --> 4
Run Code Online (Sandbox Code Playgroud)

我知道这个新Human的被视为一个Animal因为变量y存储了一个Animal.

如何设置number_of_legs属性,使其x.number_of_legs为4且y.number_of_legs为2?

Jon*_*art 5

首先,您应该将实际C#属性用于此类可公开访问的值,而不是公共字段.

标记virtual基类中的属性,以便可以在派生类中重写它.

public class Animal {

    // By default, Animals will have 4 legs.
    public virtual int NumberOfLegs { get { return 4; } }
}
Run Code Online (Sandbox Code Playgroud)

然后override它在派生类中提供不同的实现.

public class Human : Animal {

    // But humans have 2 legs.
    public override int NumberOfLegs { get { return 2; } }
}
Run Code Online (Sandbox Code Playgroud)

  • 不可以.字段只是存储器中存储变量的位置.`virtual`调用遍历vtable,它根据对象类型确定调用哪些函数,而不管变量引用的类型如何.属性基本上只是`get`和`set`方法. (2认同)