根據C#的規則,當子類別B透過關鍵字new隱藏繼承自父類別A的方法Fun()時,如果使用父類型的變數來呼叫Fun()方法,它會呼叫父類別A中定義的方法,而不是子類別B中定義的方法。這是因為new關鍵字用於隱藏父類別的成員,而不是覆寫它。當子類別的成員隱藏了基類的成員時,除非明確地使用子類別的型別來呼叫,否則當透過基類別的引用或變數呼叫該成員時,將會使用基類別的成員。
在這個例子中,當Main方法執行時,首先會創建一個B的實例。雖然A是一個抽象類別,這裡實際上是創建了一個B類別的實例,但是將它賦值給了一個A型別的變數a。因此,當呼叫a.Fun()時,會呼叫到父類別A中定義的Fun()方法。
應該注意的是,因為A是一個抽象類別,它不能直接被實例化,但是這段代碼是有效的,因為實例化的是B類別,這是繼承自A的具體類別。
所以,給定的代碼片段的輸出將會是:
B
A.Fun()
這裡,B是從B類別的構造函數輸出的,A.Fun()是因為a.Fun()呼叫了在A類別中定義的Fun方法。