C# 如何重构2个略有不同的接口实现
我有两个实现接口的类。正如您所看到的,接口方法Evaluate的实现在这两个类中非常相似,但变化不大。如何在这里排除重复代码C# 如何重构2个略有不同的接口实现,c#,oop,design-patterns,C#,Oop,Design Patterns,我有两个实现接口的类。正如您所看到的,接口方法Evaluate的实现在这两个类中非常相似,但变化不大。如何在这里排除重复代码 public class Policy1 : IPolicy { private readonly IPolicy _innerPolicy1; private readonly IPolicy _innerPolicy2; public Task Evaluate(Input input) { _innerPolicy1
public class Policy1 : IPolicy
{
private readonly IPolicy _innerPolicy1;
private readonly IPolicy _innerPolicy2;
public Task Evaluate(Input input)
{
_innerPolicy1.Evaluate(input);
_innerPolicy2.Evaluate(input);
return Task.FromResult(input);
}
}
public class Policy2 : IPolicy
{
private readonly IPolicy _innerPolicy1;
private readonly IPolicy _innerPolicy2;
private readonly IPermissionService _permissionService;
public Task Evaluate(Input input)
{
_innerPolicy1.Evaluate(input);
if (HasInnerPolicy2Permission(input))
{
_innerPolicy2.Evaluate(input);
}
return Task.FromResult(input);
}
private bool HasInnerPolicy2Permission(Input input)
{
return _permissionService.GetInnerPolicy2Permission(input);
}
}
从抽象类派生Policy1和Policy2。实现根据Policy2类进行评估,并为HasInnerPolicy2Permission提供一个抽象方法。Policy1仅返回true,Policy2实现与该类中的一样 比如:
public abstract class Policy : IPolicy
{
protected readonly IPolicy _innerPolicy1;
protected readonly IPolicy _innerPolicy2;
public Task Evaluate(Input input)
{
_innerPolicy1.Evaluate(input);
if (HasInnerPolicy2Permission(input))
{
_innerPolicy2.Evaluate(input);
}
return Task.FromResult(input);
}
protected abstract bool HasInnerPolicy2Permission(Input input);
}
public class Policy1 : Policy
{
protected override bool HasInnerPolicy2Permission(Input input)
{
return true;
}
}
public class Policy2 : Policy
{
private readonly IPermissionService _permissionService;
protected override bool HasInnerPolicy2Permission(Input input)
{
return _permissionService.GetInnerPolicy2Permission(input);
}
}
如果您认为您可能有一个具有显著不同求值函数的Policy3类,那么您可以将原始版本虚拟化。继续提问可能会更好,您的答案基本上是通过一个从IPolicy继承的抽象类,因为看起来功能差异很大,你不能把这两个类按原样塞进一起。更令人担心的是,在不同情况下,在不同地方重复调用两行非常简单的代码,这是因为这些方法声称是异步的,如果这两个类包含相同的功能,并且在一个或两个地方发生了变化,那么它们的所有工作都是同步进行的。我建议使用模板方法模式。请看和。这也是政策实名有助于解决的问题之一。重复可能是偶然的,也可能与问题域中的重复关系有关。当然,您总是可以重构出重复的代码,但是您可能没有做出一个好的设计,特别是如果它是偶然的重复。