在 C# 中,衍生類別可以包含擁有與基底類別方法相同之名稱的方法。
基底類別方法必須定義為 virtual。
如果衍生類別中的方法前面沒有加上 new 或 override 關鍵字,編譯器會發出警告,且方法的行為會如同有 new 關鍵字一般。
如果衍生類別中的方法前面加上 new 關鍵字,該方法會定義為與基底類別中的方法無關。
如果衍生類別中的方法前面加上 override 關鍵字,則衍生類別的物件會呼叫該方法,而不是基底類別方法。
衍生類別可使用 base 關鍵字呼叫基底類別方法。
override 、virtual 和 new 關鍵字也可用於屬性、索引子和事件。
override
簡單的說,就是Class2繼承Class1,也就是說父類別為Class1,子類別為Class2,換言之Class1為基底類別,Class2為衍生類別,而有時因為繼承的物件( Class2 )的方法( Test )會和父類別( Class1 )的方法 ( Test )有不一樣的處理邏輯,子類別的方法名稱可能會和父類別的方法名稱相同,但其實裡面的邏輯不同,而這個時候,就可以在父類別的方法裡面加上Virtual,子類別裡面的方法加上override,來進行方法邏輯複寫的動作,如下程式碼。
namespace ConsoleApplication1
{
public class Class1
{
public virtual void Test()
{
Console.WriteLine("Class1.Test()");
}
}
public class Class2 : Class1
{
public override void Test()
{
Console.WriteLine("Class2.Test()");
}
}
class Program
{
static void Main(string[] args)
{
Class2 c = new Class2();
c.Test();
}
}
}
{
public class Class1
{
public virtual void Test()
{
Console.WriteLine("Class1.Test()");
}
}
public class Class2 : Class1
{
public override void Test()
{
Console.WriteLine("Class2.Test()");
}
}
class Program
{
static void Main(string[] args)
{
Class2 c = new Class2();
c.Test();
}
}
}
上面的程式碼執行結果會是Class2.Test裡的的法方。
new
對於Overrride的不同,new在運作上有點不同,它必須要仰賴Virtual,。
namespace ConsoleApplication1
{
public class Class1
{
//故意沒加上Virtual
public void Test()
{
Console.WriteLine("Class1.Test()");
}
}
public class Class2 : Class1
{
//這裡也不使用override關鍵字來複寫
public void Test()
{
Console.WriteLine("Class2.Test()");
}
}
class Program
{
static void Main(string[] args)
{
Class2 c = new Class2();
c.Test();//
}
}
}
{
public class Class1
{
//故意沒加上Virtual
public void Test()
{
Console.WriteLine("Class1.Test()");
}
}
public class Class2 : Class1
{
//這裡也不使用override關鍵字來複寫
public void Test()
{
Console.WriteLine("Class2.Test()");
}
}
class Program
{
static void Main(string[] args)
{
Class2 c = new Class2();
c.Test();//
}
}
}
上面的程式結果,結果還是會出現Class2.Test()
就算不加上new和override還是可以正常編譯,但系統會出現警告提示,雖然說在這方面沒有什麼太大的不同,但是還是最好依循著正確的方式撰寫程式。
-雲遊山水為知已逍遙一生而忘齡- 電腦神手
-雲遊山水為知已逍遙一生而忘齡- 電腦神手
沒有留言:
張貼留言