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

时间:2013-03-27 03:13:46

标签: c# inheritance

我有一个名为Animal的班级。对于任何给定的动物aa.number_of_legs应为4。

我有一个名为Human的类,它继承自Animal。对于任何给定的人hh.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?

3 个答案:

答案 0 :(得分:5)

首先,您应该使用实际的C#properties来获取此类可公开访问的值,而不是公共字段。

在基类中标记属性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; } }
}

答案 1 :(得分:1)

试试这个......

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) { }
    }
}

答案 2 :(得分:0)

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