Мне часто кажется, что я сталкиваюсь с ситуацией, когда у меня есть абстрактный тип, который должен обрабатываться по-разному, в зависимости от конкретной реализации.
Например, abstract class Payment
может быть разделено на подклассы как class CreditCard
или class StoredCredit
.Для фактической обработки платежа мы хотим использовать реализацию
interface IPaymentTaker {
PaymentProcessingResult Process(Payment payment); }
, то есть либо
class CreditCardPaymentTaker : IPaymentTaker { ... }
, либо
class StoredCreditPaymentTaker : IPaymentTaker { ... }
В прошлом я вводилIDictionary в родительский компонент и затем выполняется
_paymentTakers[payment.GetType()].Process(payment);
Недостатком этого является то, что реализации IPaymentTaker
недостаточно строго типизированы, поэтому первый бит метода Process должен быть:
Process(Payment payment)
{
var creditCardPayment = payment as CreditCardPayment;
if (creditCardPayment == null)
throw new Exception("Payment must be of type CreditCard");
}
Я уверен, что должно быть имя для шаблона, который я пытаюсь реализовать, но я не знаю, что это такое!
В идеале я бы
(а) мог бы создать экземпляр ProcessProcessor только на основе типа Платежа, не создавая словарь;
(b) мог быстрого типизировал PaymentProcessors, которые принимают только тот подкласс, который они могут использовать.
У кого-нибудь есть изящный способ решения этой проблемы?