2010-10-02 76 views
1

如果我沒有將方法標記爲virtual,它是否可用於派生類?做超類和子類對象共享常用方法嗎?

如果使用對象a,我更改基類的方法。然後對象b訪問基類(可用於派生類)的相同方法m1()

它會按對象a打印那些更改的值嗎?

他們會有共同的方法嗎?

class A 
{ 
    public int m(int i) 
    { 
     return i * i; 
    } 
} 

class B : A 
{ 
} 

class C 
{ 
    static void Main() 
    { 
     A a = new A(); 
     int x = a.m(2); // returns 4 

     B b = new B(); 
     int y = b.m(4); // 16 
    } 
} 
+0

你在調試代碼時看到了什麼? – 2010-10-02 14:11:53

回答

2

是的,因爲派生類是基類的一種類型。

考慮一個哺乳動物類。所有的哺乳動物呼吸,所以我們會擁有Mammal.Breathe()。現在考慮一個Cat類。由於貓是哺乳動物,所以我們可以從哺乳動物得到這個,然後已經有一個從Mammal繼承的Cat.Breathe(),沒有任何額外的工作(「沒有額外的工作」是OO的一個節省時間的方面)。

如果Mammal.Breathe()是虛擬的,那麼我們可以使它在Cat.Breathe()的情況下表現不同。如果它不是虛擬的,我們不能,雖然非虛擬方法可以調用虛擬方法,這會使其行爲的一部分被覆蓋。

+0

我明白了,先生,你的解釋總是很有用........我的上述程序是正確的先生?我也想知道如果使用對象「b」我做了超類的方法的一些改變,然後我做了一個類的新對象,那麼如果我調用超類的對象「a」的方法已經被改變使用基類對象然後a.m1()將得到該更改的方法 – NoviceToDotNet 2010-10-02 14:31:24

+0

不看語法..我想學習概念 – NoviceToDotNet 2010-10-02 14:35:45

+0

我們回到了隱藏和重新騎馬之間的差異。我建議您嘗試各種可能性,並在調試器中逐個執行代碼。這裏和你的其他問題的解釋已經涵蓋了相關理論,你需要對實際發生的事情有一個感覺*。 – 2010-10-02 14:40:05

1

如果我不使用虛擬的方法,將它提供給派生類?

是的,該方法將可用於任何派生類,但您將無法在派生類中重寫此方法並更改其行爲。在您的示例類B擁有m1方法,因爲它來自類A但不能覆蓋它,因爲該方法不是虛擬的。

事實上,您的示例甚至不會編譯,因爲您沒有爲 m1方法指定返回類型。此外,如果未指定方法 access modifier,則會假定爲 private,您甚至無法在派生類中調用基本方法(除非使用反射)。 (在通過@dtb編輯之後,代碼將立即編譯)