重寫:是指子類重新定義父類虛函數的方法。
public class Employee
{
virtual public void CalculatePlay()
{
Console.WriteLine("Employee");
}
}
class SalariedEmployee : Employee
{
public override void CalculatePlay()
{
Console.WriteLine("Salary");
}
}
static void Main(string[] args)
{
Employee em = new SalariedEmployee();
em.CalculatePlay();
}
就是在基類中的方法用virtual關鍵字來標識,然後在繼承類中對該類進行重寫(override),這樣基類中的方法已經被重寫了,已經失去了功能了。當讓基類的對象的引用直接指向繼承類的對象時(多態性),調用該方法則是調用的繼承類的方法。
重寫方法要求具有相同的方法簽名,包括:相同的方法名、相同的參數列表和相同的返回值類型。
在一個類中存在方法名相同、參數列表不同(參數個數或者參數類型不同)、返回值類型可以不相同 的現象我們稱之
為overloading,即重載
方法隱藏:無論基類中的方法是否用了virtual關鍵字,繼承類中都可以用new關鍵字(如果不用new的話,不會產生錯誤,但會生成一個編譯警告)將基類中的方法隱藏,重寫就是原來的(基類中)已經不存在了,而隱藏是原來的還存在。所以當讓基類的對象的引用直接指向繼承類的對象時(多態性),調用該方法則是調用的基類的方法。
基類方法不做申明(默認為非虛方法),在派生類中使用new聲明此方法的隱藏。訪問父類則調用父類的方法,訪問子類則調用子類的方法。
public class Employee
{
public void Fn()
{
Console.WriteLine("Employee");
}
}
class SalariedEmployee : Employee
{
public new void Fn()
{
Console.WriteLine("SalariedEmployee");
}
}
static void Main(string[] args)
{
SalariedEmployee se = new SalariedEmployee();
se.Fn();
Employee em = new SalariedEmployee();
em.Fn();
}
}
結果為:
SalariedEmployee
Employee