C# 虛方法、非虛方法、重寫override、new,具體調用哪個方法分析


首先先看override和new的語法特征:

    • override
      1. override是派生類用來重寫基類中方法的;
      2. override不能重寫非虛方法和靜態方法
      3. override只能重寫用virtual、abstract、override修飾的方法;
      4. 不能使用修飾符 new、static、virtual 或 abstract 來修改 override 方法。
      new
      1. new是派生類用來隱藏基類中的方法的;也就是說在派生類中“看不到”基類中的方法;
      2. 如果要在派生類中隱藏(不是重寫)基類中的方法,而沒有使用new關鍵字,編譯時會出現一個警告,提示如果是要隱藏基類中的方法,請使用new關鍵字【默認是new修飾的】;
      3. 派生類可以隱藏基類中的虛方法,也可以隱藏基類中的普通方法。
      4. 如果在派生類中用private來修飾new 方法,那么只在該派生類中隱藏了基類中的方法,在該派生類之外,相當於沒有隱藏基類中的方法;
      5. 如果在派生類中隱藏了基類中的方法,在該派生類的派生類中,將延續對該派生類對基類方法的隱藏。

測試結論:

  • 經測試:只有類中有虛方法重寫override,才會表現出運行時類型方法特征其他無論是不是虛方法,是不是有new 修飾,是不是有override 修飾,都表現出編譯時類型方法特征【即聲明的類型是什么就調用什么方法】。

以下是測試方法內容:

//1、虛方法重寫override,運行時類型方法特征。
//1.1、虛方法未重寫,編譯時【未重寫派生類調用基類方法】產生裝箱或轉型
//1.2、虛方法重寫new或沒有new也沒有override,編譯時【重寫派生類隱藏基類方法】
//2、非虛方法重寫。編譯時【重寫派生類隱藏基類方法】
//3、非虛方法未重寫,調用基類方法。編譯時【未重寫派生類調用基類方法】產生裝箱或轉型

 

 

 

 

 代碼

 1     public class TestShape
 2     {
 3         public static void Main(string[] args)
 4         {
 5             //主要測試:1、虛方法重寫override,運行時類型方法特征。
 6             //1.1、虛方法未重寫,編譯時【未重寫派生類調用基類方法】裝箱或轉型
 7             //1.2、虛方法重寫new或沒有new也沒有override,編譯時【重寫派生類隱藏基類方法】
 8             //2、非虛方法重寫。編譯時【重寫派生類隱藏基類方法】
 9             //3、非虛方法未重寫,調用基類方法。編譯時【未重寫派生類調用基類方法】裝箱或轉型
10 
11             //1、
12             Shape shape = new Circle();
13             shape.MethodVirtual();//circle override MethodVirtual
14             //2、編譯時
15             Diamond diamond = new Diamond();
16             diamond.Method();//Diamond default Method
17             Shape s = new Diamond();
18             s.Method();//base Method call
19             //結論:非虛方法重寫編譯時 類型方法。
20             //1.2 編譯時
21             diamond.MethodVirtual();//Diamond default MethodVirtual,沒有使用override默認是new
22             s.MethodVirtual();//base MethodVirtual call,沒有使用override默認是new
23             //3、編譯時
24             Circle circle = new Circle();
25             circle.Method();//base Method call
26         }
27     }
28     public class Shape
29     {
30         public virtual void MethodVirtual()
31         {
32             Console.WriteLine("base MethodVirtual call");
33         }
34         public void Method()
35         {
36             Console.WriteLine("base Method call");
37         }
38     }
39     public class Circle: Shape
40     {
41         public override void MethodVirtual()
42         {
43             Console.WriteLine("circle override MethodVirtual");
44         }
45     }
46     public class Triangle : Shape
47     {
48         public new  void MethodVirtual()
49         {
50             Console.WriteLine("Triangle new MethodVirtual");
51         }
52         public new void Method()
53         {
54             Console.WriteLine("Triangle new Method");
55         }
56     }
57     public class Diamond : Shape
58     {
59         //默認是使用了new關鍵字
60         public void MethodVirtual()
61         {
62             Console.WriteLine("Diamond default MethodVirtual");
63         }
64         public void Method()
65         {
66             Console.WriteLine("Diamond default Method");
67         }
68     }
View Code

 

語言對比

Java——默認虛方法

默認情況下,Java中的方法都是虛方法。假如希望方法具有非虛的行為,就必須顯式密封它。相反,C#的方法默認為非虛方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM