Java 和 C# 在繼承時 override 的差別
c# 在子類使用 override 關鍵字時,父類對應的方法上要加上 abstract 或 virtual
父類方法上加上 abstract,則子類一定要實作該方法
父類方法上加上 virtual 時,則子類不一定要實作該方法
父類用 virtual 時,子類可以選擇用 override 或 new (預設)
子類不管用 override 或 new,當物件型別為子類時使用該方法均為子類實作的內容
如果子類用 override,則物件轉型為父類並呼叫該方法時,其執行為子類實作的內容
如果子類用 new,則物件轉型為父類並呼叫該方法時,其執行為父類實作的內容
欲呼叫父類方法時需使用 base 關鍵字
java 在子類使用 override 關鍵字時,父類不一定要加上 abstract
父類方法上加上 abstract,則子類一定要實作該方法
當父類有相同簽名(signature)的方法時,子類不管有沒有加上@Override,不管是否轉型為父類,都會覆蓋父類方法
欲呼叫父類方法時需使用 super 關鍵字
main.cs
class Program
{
static void Main(string[] args)
{
Sub sub = new Sub();
Sub1 sub1 = new Sub1();
sub.Print(); //sub
sub1.Print(); //sub1, print
((Parent)sub).Print(); //sub
((Parent)sub1).Print(); //parent
((Parent)sub).CallPrint(); //sub
((Parent)sub1).CallPrint(); //parent
}
}
class Parent
{
public void CallPrint() { Print(); }
public virtual void Print() { Console.WriteLine("parent"); }
}
class Sub : Parent
{
public override void Print() { Console.WriteLine("sub"); }
}
class Sub1 : Parent
{
public new void Print()
{
Console.WriteLine("sub1");
base.Print();
}
}
main.java
public class App
{
public static void main( String[] args )
{
Sub sub = new Sub();
Sub1 sub1 = new Sub1();
sub.Print(); //sub
sub1.Print(); //sub1, parent
((Parent)sub).Print(); //sub
((Parent)sub1).Print(); //sub1
((Parent)sub).CallPrint(); //sub
((Parent)sub1).CallPrint(); //sub1, parent
}
}
abstract class Parent{
public void CallPrint(){ Print(); }
public void Print() { System.out.println("parent"); }
}
class Sub extends Parent {
@Override
public void Print(){ System.out.println("sub"); }
}
class Sub1 extends Parent {
public void Print(){
System.out.println("sub1");
super.Print();
}
}
沒有留言:
張貼留言