C# 设计要点:多态性适合我的情况吗

C# 设计要点:多态性适合我的情况吗,c#,oop,architecture,C#,Oop,Architecture,我的情况与以下情况类似: interface IAbstractPaymentService { void ProcessPayment(); } interface IPaymentGateway1Service : IAbstractPaymentService { } // Do not define extra methods but needed for IoC container configuration interface IPaymentGateway2Service : IA

我的情况与以下情况类似:

interface IAbstractPaymentService { void ProcessPayment(); }
interface IPaymentGateway1Service : IAbstractPaymentService { } // Do not define extra methods but needed for IoC container configuration
interface IPaymentGateway2Service : IAbstractPaymentService { } // Do not define extra methods but needed for IoC container configuration

public abstract class PaymentProcessor 
{ 
    protected abstract void ThisMethodNeedsASpecializedService(IAbstractPaymentService abstractPaymentService);
}

public class PaymentGateway1Processor : PaymentProcessor
{
    protected override void ThisMethodNeedsASpecializedService(IAbstractPaymentService abstractPaymentService)
    {
        return ThisMethodNeedsASpecializedService(abstractPaymentService as IPaymentGateway1Service) // Don't worry, I do security checks
    }

    public void ThisMethodNeedsASpecializedService(IPaymentGateway1Service paymentGateway1Service)
    {
        paymentGateway1Service.ProcessPayment(); 
    }
}

public class PaymentGateway2Processor : PaymentProcessor
{
    protected override void ThisMethodNeedsASpecializedService(IAbstractPaymentService abstractPaymentService)
    {
        return ThisMethodNeedsASpecializedService(abstractPaymentService as IPaymentGateway2Service) // Don't worry, I do security checks
    }

    public void ThisMethodNeedsASpecializedService(IPaymentGateway2Service paymentGateway2Service)
    {
        paymentGateway2Service.ProcessPayment(); 
    }
}
我对这种抽象不太满意,因为多态性的概念是你不关心底层类型,你只想应用某种行为。但在这里,即使我创建了PaymentProcessor工厂,每次消费者都需要调用此MethodNeedsSpecializedService(),他也需要知道底层类型以注入正确的服务

我正在考虑将服务存储在一个内部属性中,这样我就可以创建一个工厂,在创建时注入服务,而使用者不需要知道所使用的服务,因此,不需要关心底层类型。但我一直认为在属性中存储服务实例是一种不好的做法,我不确定是否应该这样做


您对此有何看法?您会采取不同的做法吗?

更好的方法是通过
PaymentProcessor
costructor注入
IAbstractPaymentService
。例如:

public abstract class PaymentProcessor 
{ 
    protected abstract void ThisMethodNeedsASpecializedService();
}

public class PaymentGateway1Processor : PaymentProcessor
{
    private IPaymentGateway1Service paymentGateway1Service;

    public PaymentGateway1Processor(IPaymentGateway1Service paymentGateway1Service){
        this.paymentGateway1Service = paymentGateway1Service;
    }

    public void ThisMethodNeedsASpecializedService()
    {
        this.paymentGateway1Service.ProcessPayment(); 
    }
}

这就是我最终所做的,所以您投票赞成:将服务存储在内部属性中。我也意识到,在这种情况下,这不应该是一个坏的做法。谢谢你的洞察力