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

本文关键字:派生 何访问 访问 | 更新日期: 2023-09-27 18:06:06

我有一个叫做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;
 }

但是如果我随便找一个动物问它有几条腿,答案总是2:

 Animal x = new Animal();
 Animal y = new Human();
 x.number_of_legs // --> 4
 y.number_of_legs // --> 4

我理解这个新的Human被视为Animal,因为变量y存储了Animal

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

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

首先,对于像这样的可公开访问的值,您应该使用实际的c#属性,而不是公共字段。

在基类中标记属性virtual,以便它可以在派生类中被覆盖。

public class Animal {
    // By default, Animals will have 4 legs.
    public virtual int NumberOfLegs { get { return 4; } }
}

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

public class Human : Animal {
    // But humans have 2 legs.
    public override int NumberOfLegs { get { return 2; } }
}

try this…

namespace StackOverflow
{
    public class Animal
    {
        public int Legs { get; set; }
        public Animal() { Legs = 4;  }
        public Animal(int legs) { Legs = legs; }
    }
    public class Human : Animal
    {
        public Human() : base(2) { }
    }
}

Joe,你也可以试试…(对于派生类中的多个初始化项)

namespace StackOverflow
{
    public class Animal
    {
        public int Legs { get; set; }
        public string Color { get; set; }
        public string Origin { get; set; }
        public Animal() { Initialize(); }
        public virtual void Initialize() { Legs = 4; Color = "blue"; Origin = "everywhere"; }
    }
    public class Human : Animal
    {
        public Human() { }
        public override void Initialize() { Legs = 2; Color = "black"; Origin = "Africa"; }
    }
    public class Program
    {
        public static void main()
        {
            Animal a = new Animal();
            Animal h = new Human();
        }
    }
}