设计模式,要求基类的子类从基类调用方法

时间:2017-04-27 00:28:40

标签: c# .net design-patterns polymorphism

我们说我有一个基类

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

我有许多类型的验证器都来自基类。 我只想要派生类中的一件事:它们不会忘记在代码中的某个地方调用AuthenticateSuccessfully()。所有身份验证者都有自己的逻辑,但最终他们应该在准备好的时候(在验证之后等)调用AuthenticateSuccessfully()

如何在编译时确保每个派生的身份验证器至少调用AuthenticateSuccessfully()方法一次?

3 个答案:

答案 0 :(得分: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 :(得分:1)

仅通过设计模式,这是无法实现的。根据定义,派生类可以按照自己的意愿自由执行。

现在你提到了你想在编译时验证这是真的。这是一种完全不同的方法。我假设您希望通过警告开发人员违规来基本执行“自动代码审查”。有静态代码分析工具,您可以在其中编写规则来执行该验证。可能是JetBrains ReSharper。请参阅此SO帖子:How to add custom code analysis in ReSharper

答案 2 :(得分:0)

我认为您正在寻找模板模式。您可以在基类中使用一些抽象方法,如bool loginAttempt(),如果尝试返回true,则在基类中调用AuthenticatedSuccessfully()

这不是您正在寻找的(确保在编译时派生类调用某些方法),但在确保派生类的行为的条款中,模板模式是现场。