2014-03-04 62 views
0

我终于有时间教一个孩子理解和使用访问修饰符和oop基和这个关键字。为什么在这种情况下,我没有设置基类的属性

和我做了一个简单的,我认为在世界上最简单的类

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

临屋的情况是如此简单 - 你看,我有一个受保护property Numberlegs in Creature Class;

在构造函数中Mammal类我有

base.Numberlegs = 4; 

所以我知道此行应该设置Numberlegs财产,但不Mamal类,但在它的基类 - >Creature。 我认为,当我呼吁Walk()方法的MAMAL类这个.Numberlegs将是0 - >但它是4;

+0

在你的代码没有哺乳动物类物业Numberlegs的压倒一切的,所以物业只是,它已经从基类 –

回答

1

NumberOfLegs在基类中定义。 Mamal不会重新实施新的财产。

因此,有base.NumberOfLegs和this.NumberOfLegs

1

使用basethis没有区别你的情况完全是多余的。当您需要解决命名冲突时,这些关键字很有用。

您的情况base.Numberlegsthis.Numberlegs表示完全相同的属性 - Creature.Numberlegs。为什么?因为没有其他NumberlegsMammal中声明。相反,Mammalihnerits一切从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 
    } 
} 
+0

OMG我觉得我继承了一个没有使用过多年的遗传,我睡得很熟,所以我问了这个愚蠢的问题。谢谢你提醒我的知识! –

2

SO我知道这行应该设置Numberlegs属性,但不是在Mamal类中,而是在它的基类 - > Creature

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

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 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条腿;)

相关问题