C# 如何重构2个略有不同的接口实现

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

我有两个实现接口的类。正如您所看到的,接口方法Evaluate的实现在这两个类中非常相似,但变化不大。如何在这里排除重复代码

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继承的抽象类,因为看起来功能差异很大,你不能把这两个类按原样塞进一起。更令人担心的是,在不同情况下,在不同地方重复调用两行非常简单的代码,这是因为这些方法声称是异步的,如果这两个类包含相同的功能,并且在一个或两个地方发生了变化,那么它们的所有工作都是同步进行的。我建议使用模板方法模式。请看和。这也是政策实名有助于解决的问题之一。重复可能是偶然的,也可能与问题域中的重复关系有关。当然,您总是可以重构出重复的代码,但是您可能没有做出一个好的设计,特别是如果它是偶然的重复。