2011-08-16 36 views
3
public class Shapes 
{ 
    public virtual void Color() 
    { 
    Console.WriteLine("Shapes"); 
    } 
} 

public class Square : Shapes 
{ 
    public void Color() 
    { 
    Console.WriteLine("Square"); 
    } 
} 

public class Test 
{ 
    public static void main() 
    { 
    Shapes s1 = new Shapes(); 
    s1.Color(); 
    Shapes s2 = new Square(); 
    s2.Color(); 
    } 
} 

我想知道基類是否定義了一些虛擬的方法,那麼是否必須在派生類中重寫它們?同樣,如果基類方法是抽象的,我們需要在派生類中實現該方法,但是override修飾符是強制的嗎?如果忽略override修飾符會怎麼樣。在C#覆蓋修飾符是基類的虛擬/抽象方法的派生類中強制的

+0

沒有覆蓋修飾符,你不能從OOP的多態性中受益 – gekowa

回答

7

我想知道基類是否定義了一些虛擬的方法, 那麼它是否必須在派生類中重寫它們?

絕對不是。由派生類決定是否覆蓋虛擬方法。請注意,某些類將建議派生類在某些情況下覆蓋特定的虛擬方法,但編譯器不會強制執行此操作。

如果基類方法是抽象的,我們需要在派生類中實現方法 ,但是override修飾符是強制的嗎?

是的,您需要使用override關鍵字,否則該方法將被派生類中的定義隱藏。

如果你真的運行你的代碼,你會看到「形狀」打印兩次。這是因爲Squares類中的Color()方法未使用override關鍵字聲明。因此,隱藏了的基類方法。這意味着它只能通過Squares類型的變量可訪問:

Sqares s3 = new Squares(); 
s3.Color(); 

這將打印「廣場」,因爲你調用的正確類型的變量的方法。

3

看一看this link,它可能是有用的。

副本在該網頁:

要進行方法的虛擬的虛擬改性劑具有在基類的 方法聲明被使用。然後派生類 覆蓋通過使用覆蓋關鍵字或隱藏 基本類中的虛擬方法使用new關鍵字的基本虛擬方法。如果指定 既沒有覆蓋關鍵字,也不是關鍵字,則 編譯器將發出在派生類中警告,該方法將 隱藏在基類

3

的方法,你可以看到從您發佈的示例代碼,輸出將是

Shapes 
Shapes 

這是因爲通過省略override關鍵字你是默認隱藏基類方法 - 這意味着該方法不能再以多態方式使用 - 即使s2Square的實例,因爲用於調用該方法的對象引用是Shapes,因此使用了Shapes方法。

如果這個方法在另一方面,它會甚至因爲在繼承樹對於給定的情況下最衍生Color()方法用於Shape類型的對象引用稱爲標記override

3

它完全基於你的問題的第一部分的邏輯,在從Shapes類派生的Square類中聲明瞭Color方法,它將隱藏它的父虛擬Color方法,你不需要重複相同的方法子類,當它存在於父類中時,除非要隱藏父類的方法。在抽象類中,如果你有一個虛擬方法,你必須在派生類中實現或覆蓋它們,在你範例中,這些Shapes的實例將調用Shapes類中的虛擬Color方法。

相關問題