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
  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Sub sub = new Sub();
  6. Sub1 sub1 = new Sub1();
  7. sub.Print(); //sub
  8. sub1.Print(); //sub1, print
  9. ((Parent)sub).Print(); //sub
  10. ((Parent)sub1).Print(); //parent
  11. ((Parent)sub).CallPrint(); //sub
  12. ((Parent)sub1).CallPrint(); //parent
  13. }
  14. }
  15. class Parent
  16. {
  17. public void CallPrint() { Print(); }
  18. public virtual void Print() { Console.WriteLine("parent"); }
  19. }
  20. class Sub : Parent
  21. {
  22. public override void Print() { Console.WriteLine("sub"); }
  23. }
  24. class Sub1 : Parent
  25. {
  26. public new void Print()
  27. {
  28. Console.WriteLine("sub1");
  29. base.Print();
  30. }
  31. }
  32.  

main.java
  1. public class App
  2. {
  3. public static void main( String[] args )
  4. {
  5. Sub sub = new Sub();
  6. Sub1 sub1 = new Sub1();
  7. sub.Print(); //sub
  8. sub1.Print(); //sub1, parent
  9. ((Parent)sub).Print(); //sub
  10. ((Parent)sub1).Print(); //sub1
  11. ((Parent)sub).CallPrint(); //sub
  12. ((Parent)sub1).CallPrint(); //sub1, parent
  13. }
  14. }
  15. abstract class Parent{
  16. public void CallPrint(){ Print(); }
  17. public void Print() { System.out.println("parent"); }
  18. }
  19. class Sub extends Parent {
  20. @Override
  21. public void Print(){ System.out.println("sub"); }
  22. }
  23. class Sub1 extends Parent {
  24. public void Print(){
  25. System.out.println("sub1");
  26. super.Print();
  27. }
  28. }
  29.  

沒有留言:

張貼留言