我們今天來說說virtual和override
首先先看個例子
class Employee
{
public string Name
{
get
{
return "EmployeeName";
}
set
{
Name = value;
}
}
public void printName()
{
Console.WriteLine("Employee Name is " + Name );
}
}
class Worker : Employee
{
public string Name
{
get
{
return "WorkerName";
}
set
{
Name = value;
}
}
public string rank = "C";
public void printName()
{
Console.WriteLine( "Worker Name is " + Name);
}
}
上面這個例子Employee是父類別,而Worker是繼承Employee的子類別
Employee裡面有一個屬性是Name及一個方法是printName(),而Worker中有和Employee相同的屬性Name和方法printName().
這時子類別就會隱藏父類別相的名稱的屬性和方法,所以當我們分別去執行父類別和子類別的printName()時
static void Main()
{
Employee e1 = new Employee();
e1.printName();
Worker e2 = new Worker();
e2.printName();
}
結果如下
Employee Name is EmployeeName
Worker Name is WorkerName
這時你一定會有個疑問,virtual是宣告我的屬性或方法是可以改寫的,而override是去改寫宣告為virtual的屬性或方法.
但在上例中不是就已經達到我們所需要的結果了嗎??那何必再多此一舉去宣告virtual和override,難道只是為了標識而己嗎??
為了這個疑問,我們再來看第二個例子,這次我們會將Worker的物件塞到Employee裡,因為子物件塞到父類是可行的.
static void Main()
{
Employee e1 = new Employee();
e1.printName();
Employee e2 = new Worker();
e2.printName();
}
這時你執行後得到的結果如下
Employee Name is EmployeeName
Employee Name is EmployeeName
怪了...我不是在Worker裡重新定義了Name和printName()了嗎??為什麼塞到父類別裡,就全用了父類別的定義了呢??
所以囉....這就是virtual和override的使用時機,修改一下例子
class Employee
{
public virtual string Name
{
get
{
return "EmployeeName";
}
set
{
Name = value;
}
}
public virtual void printName()
{
Console.WriteLine("Employee Name is " + Name );
}
}
class Worker : Employee
{
public override string Name
{
get
{
return "WorkerName";
}
set
{
Name = value;
}
}
public string rank = "C";
public override void printName()
{
Console.WriteLine( "Worker Name is " + Name);
}
}
如上例,我在父類別的屬性及方法加上了virtual修飾詞,另外在子類別的屬性及方法加上了override的修飾詞
這時我們再重新執行一次,得到的結果如下
Employee Name is EmployeeName
Worker Name is WorkerName
結果正確了,由上面的例子就能知道virtual和override的用法了.
留言列表