2017-04-27 40 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()

这不完全是你要找的东西(确保在编译时派生类调用某些方法),但在的条款中确保派生类的行为是模板模式。