做了1年多了C#,發現些項目過程中很多基礎東西都不是很清晰,基礎不夠牢固。現在開始複習基礎知識並做重點記錄 方法需要被重寫的時候,可以在方法前加入virtual使方法變成虛方法。 這樣我們可以重新寫個方法對虛方法進行重寫需要加上override。 註意:成員欄位和靜態函數都不能聲明為virtual, ...
做了1年多了C#,發現些項目過程中很多基礎東西都不是很清晰,基礎不夠牢固。現在開始複習基礎知識並做重點記錄
方法需要被重寫的時候,可以在方法前加入virtual使方法變成虛方法。
這樣我們可以重新寫個方法對虛方法進行重寫需要加上override。 註意:成員欄位和靜態函數都不能聲明為virtual,因為這個概念支隊類中的實例函數成員有意義。 1. 重寫override:基類方法聲明為virtual(虛方法),派生類中使用override申明此方法的重寫. 在重寫方法中,有個特殊方法,base.<MethodName>(),這裡的MethodName是父類的方法名。 class MyAlass:Base2
{
public override void ClassB()
{
base.ClassB();
Console.WriteLine("a.ClassB()");
}
}
直接在子類重寫方法中載入父類方法。
結果是
2.隱藏 : 基類方法不做申明(預設為非虛方法),在派生類中使用new聲明此方法的隱藏。自己的理解: 向下轉型繼承,子類new覆蓋父類的方法,在調用方法的時候,顯示和調用的是父類的方法而不是子類的方法。 子類override重載父類方法,在調用方法的時候,調用的是子類的方法。相當於刪除了父類的方法 說白了:new是覆蓋,override是重載,“覆蓋”並不意味著“刪除”,但“重載”意味著“刪除”,這就是“覆蓋”和“重載”的區別
例子:
//基類1
class Base
{
public void ClassA()
{
Console.WriteLine("Base.ClassA()");
}
}
//子類覆蓋基類方法
class MyClass:Base
{
public new void ClassA()
{
Console.WriteLine("c.ClassA()");
}
}
//基類2
class Base2
{
public virtual void ClassB()
{
Console.WriteLine("Base2.ClassB()");
}
}
//子類重寫基類2的方法
class MyAlass:Base2
{
public override void ClassB()
{
Console.WriteLine("a.ClassB()");
}
}
//主程式
class Program
{
static void Main(string[] args)
{
Base b1 = new Base();
b1.ClassA();
Base c = new MyClass();
c.ClassA();
Console.WriteLine("\n");
Base2 b2 = new Base2();
b2.ClassB();
Base2 a = new MyAlass();
a.ClassB();
Console.ReadKey();
}
}
運行結果: