2013-02-07 109 views
2

我想聲明一些繼承抽象類的抽象類的類。 此外,我想在子類中的一些方法自動調用通用代碼(即記錄代碼)C#抽象方法和普通代碼

public abstract class AbstractClass 
{ 
    public abstract void AbstractMethod(); 
    public void CommonCode() 
    { 
     //do something 
    } 
} 

public class ChildClass : AbstractClass 
{ 
    public void AbstractMethod() 
    { 
     //automatically call CommonCode in base class 
     //do something 
    } 
} 

是事件能幫助我嗎?

問候

+0

爲什麼不讓它虛呢?很明顯,有人仍然可以覆蓋並且無法在'base'上調用該方法... – Charleh

回答

4

沒有得到太多的花哨,你可以使抽象的方法是的「膽量」你想讓繼承者做什麼,並從基類的包裝器方法中調用它。例如:

public abstract class AbstractClass 
{ 
    // Note that this protected since consumers won't call it directly 
    protected abstract void AbstractMethod(); 

    // Instead, consumers will use this method which calls CommonCode 
    // before the abstract method. 
    public void AbstractMethodWrapper() 
    { 
     CommonCode(); 
     AbstractMethod(); 
    } 

    public void CommonCode() 
    { 
     //do something 
    } 
} 

public class ChildClass : AbstractClass 
{ 
    protected override void AbstractMethod() 
    { 
     // The wrapper method in the base handles calling common code 
     //do something 
    } 
} 
+0

@SharpC我建議你不要編輯人的答案。總是最好在評論中留下建議。如果你必須自己編輯它,那麼至少在評論中留下一個註釋,解釋你的編輯。 –

+2

我想你的意思是在ChildClass中保護覆蓋無效AbstractMethod()(否則它不會編譯),但一個很好的答案。 @MathiasMüller - 我不確定我是否同意,因爲我在修訂歷史中留下了一條評論,並且沒有編輯,所以不會編譯,所以更重要的是比一個小的建議:http://stackoverflow.com/help/privileges/edit – SharpC

+0

+1爲您的評論 - 現在更清晰。如果您在答案中發現重大缺陷,請留下評論以指出或投票,而不是編輯它。謝謝! –

0

我認爲你正在尋找的東西像下面的(如果我理解正確的話):

public abstract class AbstractClass 
    { 
     public abstract void AbstractMethod(); 
     public void CommonCode() 
     { 
      //do something 
     } 
    } 

    public class ChildClass : AbstractClass 
    { 
     public override void AbstractMethod() 
     { 
      //automatically call CommonCode in base class 
      //do something 
      base.CommonCode(); 
     } 
    } 
+2

我認爲OP希望自動調用CommonCode方法,而不需要ChildClass中的任何額外代碼。 – Maarten

+0

好吧,這個答案對我來說似乎最好:http://stackoverflow.com/a/14753944/550198 – Seany84