2011-11-25 65 views
2

當你重寫一個方法時,你不應該改變方法的行爲,你只需要專門化它。因此,您必須在重寫的方法中調用base.MyVirtualMethod()並添加專業化代碼。如何在不改變行爲的情況下覆蓋虛擬方法?

但我總是想知道什麼時候我必須致電base.MyVirtualMethod()。或者從另一個角度來看,我如何編寫我的虛擬方法?我應該期望用戶將它稱爲重寫方法的第一件或最後一件事嗎?

public class Parent 
{ 
    public virtual void MyMethod(){ /* Some code*/ } 
} 
public class Child : Parent 
{ 
    public override void MyMethod() 
    { 
     /* Does my code goes here? */ 
     base.MyMethod(); 
     /* Or does my code goes here? */ 
    } 
} 
+0

這完全取決於程序員的見解。代碼在基礎實施調用之前或之後進行。 –

+0

在你的工作流中有一個固定的位置,你的'base.MyMethod()'會被調用嗎?我的意思是,'base.MyMethod()'前後有一些代碼 –

回答

4

因此,您必須在重寫的 方法中調用base.MyVirtualMethod()並添加專業化代碼。

事實並非總是如此 - 很多時候,你不想在派生類中什麼超類這樣做你不想叫base做的情況下。

如果要擴展基本行爲,請在調用base之前或之後放置代碼,具體取決於實際問題。沒有規則「在您的代碼之前總是調用基礎」。

1

答案與許多問題一樣,「取決於」。

假設您正在擴展將某些數據寫入文件的類,並且該擴展需要在文件末尾添加更多數據(SimpleDataFile.writeFile()擴展爲ExtendedDataFile.writeFile()):在這種情況下,您需要添加代碼在調用基方法之後。

現在,假設你的擴展增加了預處理設施,也許添加顏色到基本文件輸出(SimpleDataFile.writeFile()延長了FancyDataFile.writeFile()):在這種情況下,你將任何東西之前切實行動發送到該文件,你的代碼將在基地呼叫之前結束。

1

要準確回答你的問題:不要覆蓋它:)當你覆蓋它,你會改變行爲。 大部分時間我都是在調用基本方法的基礎上放置新代碼,因爲它確實執行了這個基本行爲,然後還有一些額外的行爲。然而,這不是一成不變的,而是取決於你的需求。

0

這取決於你想做什麼,但兩者都行!

1

我通常首先調用base方法來確保任何必需的初始化已經發生,並且我的代碼實際上覆蓋了基本行爲,而不是其他方式。 顯然這取決於具體的情況,但可能很多情況下,你知道你的代碼需要先運行。

2

基本調用不存在存在。您可以在文檔中指定基礎調用應該在其他代碼之前,其他代碼之後,兩者之間還是兩者都不(缺席),以及其他代碼的性質應該是什麼。這將取決於你想要完成的事情。

如果您發現附加代碼的最佳位置確實位於base調用的某個位置,那麼這意味着基本方法應該被拆分爲兩個或多個方法。

相關問題