为什么在这种情况下我没有设置基类的属性

时间:2014-03-04 12:01:10

标签: c# oop

我终于有时间教一个孩子理解并使用访问修饰符和oop base以及此关键字。

我做了一个简单的我认为世界上最简单的课

public class Creature
{
    protected string Name {get; private set; }
    protected int Numberlegs { get; set; }

    public Creature(string name)
    {
        this.Name = name;
    }



    protected void Walk()
    {
        Console.WriteLine("Walking, walking, walking ....In Creature Method");
    }
}

所以这里是派生类Mammal

public class Mammal : Creature
{
    public int Age { get; set; }

    public Mammal(string namen, int age)
        : base(namen)
    {
        this.Age = age;
        base.Numberlegs = 4;
    }

    public void Sleep()
    {
        Console.WriteLine("Shhh! {0} is sleeping!", this.Name);
    }

    public void Walk()
    {
        Console.WriteLine(this.Name+ " has started walking with "+this.Numberlegs + " legs");
        base.Walk();
    }

Tha案例非常简单 - 您看到我在Numberlegs类中获得了受保护的属性Creature;

在构造函数的Mammal类中我有

    base.Numberlegs = 4;

我知道这一行应该设置Numberlegs属性但不能设置Mamal类,但是在其基类中 - > Creature。 我认为当我在Walk()方法中调用MAMAL类this.Numberlegs将为0 - >但它是4;

4 个答案:

答案 0 :(得分:2)

所以我知道这一行应该设置Numberlegs属性但不能在Mamal类中设置,而是在其基类中设置 - >生物

这是从Creature类继承的全部要点,你不需要重新声明NumberOfLegs - 所有Creature的子节点都会自动获得该属性。您没有明确声明新的NumberOfLegs,因此将使用基数。

答案 1 :(得分:1)

NumberOfLegs在baseclass中定义。 Mamal没有用new重新实现该属性。

因此base.NumberOfLegs和this.NumberOfLegs之间没有区别

答案 2 :(得分:1)

在您的情况下,使用basethis完全是多余的。当您需要解决命名冲突时,这些关键字非常有用。

在您的情况下,base.Numberlegsthis.Numberlegs表示完全相同的属性 - Creature.Numberlegs。为什么?因为Numberlegs中没有声明其他 Mammal。相反,Mammal ihnerits 来自Creature的所有内容,这是继承的本质。

仅在以下情况下base.Numberlegsthis.Numberlegs表示不同的属性:

两个名为相同的属性:

class Creature 
{
    protected int Numberlegs { get; set; }
}

class Mammal : Creature
{
    // new declaration of a property Numberlegs, coincidentally named 
    // the same as Numberlegs in the base class
    protected new int Numberlegs { get; set; } // notice the 'new' keyword

    void Method()
    {
        base.Numberlegs; // denotes Creature.Numberlegs
        this.Numberlegs; // denotes Mammal.Numberlegs
    }
}

虚拟财产,在后代中重写:

class Creature 
{
    protected virtual int Numberlegs { get; set; }
}

class Mammal : Creature
{
    protected override int Numberlegs { get; set; }

    void Method()
    {
        base.Numberlegs; // denotes Creature.Numberlegs
        this.Numberlegs; // denotes Mammal.Numberlegs
    }
}

答案 3 :(得分:0)

试试这个,它对我有用:

public class Creature
    {
        protected string Name { get; private set; }
        protected int Numberlegs { get; set; }

        public Creature(string name, int numLegs)
        {
            this.Name = name;
            this.Numberlegs = numLegs;
        }



        protected void Walk()
        {
            Console.WriteLine("Walking, walking, walking ....In Creature Method");
        }
    }

和哺乳动物:

公共课哺乳动物:生物     {         public int Age {get;组; }

    public Mammal(string namen, int age)
        : base(namen, 4)
    {
        this.Age = age;
    }

    public void Sleep()
    {
        Console.WriteLine("Shhh! {0} is sleeping!", this.Name);
    }

    public void Walk()
    {
        Console.WriteLine(this.Name + " has started walking with " + this.Numberlegs + " legs");
        base.Walk();
    }
}

然后在你的程序中:

哺乳动物m =新的哺乳动物(“你好”,20);             m.Walk();

你会看到4条腿;)