原來Java中的繼承和C#中的繼承是不一樣的
因為之前在學校裡學的是Java,C#是自學的,一直感覺Java和C#就像是孿生兄弟,不過今天才發現原來Java中的繼承和C#中的繼承還是有點不一樣的
在Java中子類繼承父類的方法,如果在子類重新定義了父類方法的實現,那麼這個過程就是重寫,且只能是重寫,而在C#中不一樣,在C#中可以用virtual修飾函式,表示該函式是虛擬函式,而Java中是沒有這個關鍵字的,所以問題就出現在這裡了。請看示例
在Java中:
首先定義一個父類A
public class A{
public void Show(){
System.out.print(“父類”);
}
}
再定義一個子類B
public class B extends A{
public void Show(){
System.out.print(“子類”);
}
}
定義一個測試用例
public static void main(string[] args){
A sup1=new B();
A sup2=new A();
B b=new B();
sup1.Show();
sup2.Show();
b.Show();
}
輸出結果:子類 父類 子類
再看看C#中的繼承:
public class A
{
public virtual void Show()
{
Console.Write(“父類”);
}
}
public class B:A
{
public override void Show() //問題的關鍵所在
{
Console.Write(“子類”);
}
}
public static void Main(string[] args)
{
A sup1=new B();
A sup2=new A();
B b=new B();
sup1.Show();
sup2.Show();
b.Show();
Console.ReadKey();
}
輸出結果是:子類 父類 子類
跟上面的結果一樣
但是將上面的程式碼改成如下
public class A
{
public void Show()
{
Console.Write(“父類”);
}
}
public class B:A
{
public new void Show() //問題的關鍵所在
{
Console.Write(“子類”);
}
}
public static void Main(string[] args)
{
A sup1=new B();
A sup2=new A();
B b=new B();
sup1.Show();
sup2.Show();
b.Show();
Console.ReadKey();
}
輸出結果為:父類 父類 子類
總結:當父類的函式用virtual關鍵字修飾,那麼當在子類中使用override修飾該函式,效果和Java中的繼承效果一樣,都是重寫父類函式,當在子類中用new關鍵字修飾子類的函式時,則是在子類中覆蓋父類函式。
在很多Java書籍中寫到繼承的時候會用到覆蓋來形容子類重寫父類函式。
這個問題主要是在向下引用的時候需要注意的地方。