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



我终于有时间教一个孩子理解和使用访问修饰符和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");
    }
}

所以这里是派生类哺乳动物

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

这种情况是如此简单 - 你看我在Creature类中得到了一个受保护的属性Numberlegs;

在构造函数Mammal类中,我有

    base.Numberlegs = 4;

所以我知道这一行应该设置 Numberlegs 属性,但不是在Mamal类中,而是在其基类中 -> Creature 中。我认为当我调用 Walk() 方法时MAMAL类这个。数字腿将是 0 ->但它是 4;

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

这就是从 Creature 类继承的全部意义所在,你不需要重新声明 NumberOfLegs - Creature 的所有子项将自动获得该属性。 您没有明确声明新的 NumberOfLegs,因此将使用基础。

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

因此,基地之间没有区别。腿数和这个。腿数

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

在您的情况下,base.Numberlegsthis.Numberlegs 表示完全相同的属性 — Creature.Numberlegs 。为什么?因为没有其他NumberlegsMammal中声明.相反,MammalCreature中汲取一切,这是继承的本质。

只有在以下情况下,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
    }
}

试试这个,它对我有用:

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; set; }

    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 = 新哺乳动物("hello", 20); m.Walk();

你会看到4条腿;)

最新更新