2017-04-27 58 views
1

的方法比方說,我有一個基類設計模式對於需要一個基類的兒童調用基類

public class BaseAuthenticator 
{ 
    protected void AuthenticateSuccessfully() 
    { 
     // Do stuff 
    } 
} 

而且我有很多類型的驗證器都從基類派生。 我只想從派生類中得到一件事:就是他們不會忘記在他們的代碼中調用AuthenticateSuccessfully()。所有驗證者都有自己的邏輯,但最終他們應該在準備好的時候(驗證後等)隨時撥打AuthenticateSuccessfully()

如何確保在編譯時每個派生的認證者至少調用AuthenticateSuccessfully()方法一次?

回答

2

模板方法模式可以在這種情況下工作(這是在運行時)

void Main() 
{ 
    var authenticators = new List<UserQuery.BaseClass>(); 
    authenticators.Add(new ConcreteClassA()); 
    authenticators.Add(new ConcreteClassB()); 
    foreach (var authenticator in authenticators) 
    { 
     authenticator.TemplateMethod(); 
    } 
} 


public abstract class BaseClass 
{ 
    public abstract void Validate(); 

    public void AuthenticateSuccessfully() 
    { 
     Console.WriteLine("Base Class Authentication"); 
     // Do Stuff Specific to base class 
    } 

    public void TemplateMethod() 
    { 
     Console.WriteLine("Template method called"); 
     Validate(); 
     AuthenticateSuccessfully(); 
    } 
} 

public class ConcreteClassA : BaseClass 
{ 
    public override void Validate() 
    { 
     Console.WriteLine("Validate Method of ConcreteClassA"); 
     //Do Whatever here Specific to the Concrete class A 
    } 
} 

class ConcreteClassB : BaseClass 
{ 
    public override void Validate() 
    { 
     Console.WriteLine("Validate Method of ConcreteClassB"); 
     //Do Whatever here Specific to the Concrete class B 
    } 
} 
1

單靠設計模式,這是無法實現的。根據定義,派生類可以按照自己的意願自由執行。

現在你在最後提到你想驗證這是真的在編譯時。這是完全不同的方法。我假設你想基本上通過提醒開發者違規行爲來執行「自動代碼審查」。有靜態代碼分析工具,您可以在其中編寫規則來執行驗證。可能JetBrains ReSharper。看到這個帖子:How to add custom code analysis in ReSharper

+0

這個答案更有意義,因爲明白,如果子類開發商不叫'base.AuthenticateSuccessfully'事情會失敗,所以它的比你的頭痛更多。你需要確保你正確地記錄/評論你的班級/方法,以防其他人不會錯過。有趣的問題。 – niksofteng

0

我認爲你正在尋找模板模式。例如,如果嘗試返回true,則可以在基類中使用一些抽象方法,如bool loginAttempt(),並在基類中調用AuthenticatedSuccessfully()

這不完全是你要找的東西(確保在編譯時派生類調用某些方法),但在的條款中確保派生類的行爲是模板模式。