あなたPayPayとGoogleクラスは、支払いを説明するために必要なデータを表していますか?通常、Paymentクラスは支払いを表す必要があります。クラスの仕事が支払いを処理することである場合、それはおそらくのような名前を持ち、PaymentProcessorそのインターフェースはのようなものIPaymentProcessor(または実際にIPaymentServiceは、または同様のもの)を持つ必要があります。
MakePayment()支払いクラスが実際の支払いを表す場合、クラスはそのメソッドにパラメーターを必要としません。代わりに、行われている支払いを説明するためにインスタンスデータに依存します。
または、次のようなものを使用することもできます(Payment支払い自体を説明するために引き続き使用します)。
interface IPaymentProcessor<T> where T : IPayment
{
void ProcessPayment(T payment);
}
class PayPayPaymentProcessor : IPaymentProcessor<PayPay>
{
void ProcessPayment(PayPay payment) { /* some implementation here */ }
}
class PayPayPaymentProcessor : IPaymentProcessor<Google>
{
void ProcessPayment(Google payment) { /* some implementation here */ }
}
私はおそらくクラスPayPayPaymentにGooglePayment名前を付けるので、名前はタイプをより明確に表します。
class PayPayPaymentProcessor : IPaymentProcessor<PayPayPayment>
{
void ProcessPayment(PayPayPayment payment) { /* some implementation here */ }
}
class PayPayPaymentProcessor : IPaymentProcessor<GooglePayment>
{
void ProcessPayment(GooglePayment payment) { /* some implementation here */ }
}
これは、PaymentParametersクラスを使用するために提案された他のアプローチと非常に似ていますが、単一責任の原則により厳密に準拠していることに注意してください。Brian Cauthonの回答では、PaymentParametersクラスは、あらゆる種類の支払いについて可能なすべてのパラメーターの和集合を保持する必要があります。ここで、パラメータタイプは、それらが表す支払いのニーズに固有である可能性があります(また、固有である必要があります)。