2021年9月11日 星期六

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();
    }
}


沒有留言:

張貼留言