我们说我有一个基类
public class BaseAuthenticator
{
protected void AuthenticateSuccessfully()
{
// Do stuff
}
}
我有许多类型的验证器都来自基类。
我只想要派生类中的一件事:它们不会忘记在代码中的某个地方调用AuthenticateSuccessfully()
。所有身份验证者都有自己的逻辑,但最终他们应该在准备好的时候(在验证之后等)调用AuthenticateSuccessfully()
。
如何在编译时确保每个派生的身份验证器至少调用AuthenticateSuccessfully()
方法一次?
答案 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()
。
这不是您正在寻找的(确保在编译时派生类调用某些方法),但在确保派生类的行为的条款中,模板模式是现场。