最近總是很懶,看書的時候不想動手。明知道編程這東西只是看是不行的,所以,還是要堅持把Demo進行到底~
之前知道,建構函式在繼承關係中的執行順序是這樣的:首先執行基類的建構函式,而後才是要執行個體化的類本身。當然這裡的基類是個遞迴的過程,也就是說只要存在繼承關係,那就會一直遞迴到System.Object為止.
其實這層關係,寫兩個具有繼承關係的類,再寫這個建構函式,執行個體化這個繼承類,單步調試就可以很清晰的看到建構函式的執行過程.這裡,如果兩個類都採用預設的建構函式,那這個關係自然是看不到的.
這裡我要說的是具有參數的建構函式的執行。比如說,我們會把一些共有的屬性寫進基類中去,而在執行個體化繼承類的時候,往往會在建構函式中初始化這些屬性(基類),這個時候,就要用到Base關鍵字,除此之外,建構函式的執行順序依然遵循上述順序.
Demo:using System;
using System.Collections.Generic;
using System.Text;
namespace ConstructorDemo
{
class Program
{
static void Main(string[] args)
{
LittleBird lb = new LittleBird("lbname",4);
Console.WriteLine(lb.Name+"---"+lb.Num);
lb.showName();
Animal ain = new bird("birdname");
Console.WriteLine(ain.Name);
ain.showName();
}
}
abstract class Animal
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
public Animal(string name)
{
this.name = name;
}
public abstract void showName();
}
class bird : Animal
{
public bird(string bird_name)
: base(bird_name) //給基類建構函式傳參
{
}
public override void showName()
{
Console.WriteLine("hi,this is bird :{0}",Name);
}
}
class LittleBird : bird
{
private int num;
public int Num
{
get
{
return num;
}
set
{
num = value;
}
}
public LittleBird(string lb_name,int lb_num)
: base(lb_name) //給基類建構函式傳參
{
this.num = lb_num; //執行本身建構函式
}
public override void showName()
{
base.showName(); //調用基類方法
Console.WriteLine("hi,this is little bird :{0}",Name);
}
}
}
同時注意到Base關鍵字的用法:
1.調用基類建構函式,並傳參。
2.調用基類方法(當然是在重寫的方法中調用)