Как сделать так, чтобы метод возвращал один из почти одинаковых классов от случая к случаю?

#c# #design-patterns #coding-style #clean-architecture #solid

#c# #дизайн-шаблоны #стиль кодирования #чистая архитектура #твердый

Вопрос:

Я интегрирую новый способ оплаты в наш сервисный проект. Я все закодировал. Теперь я хочу, чтобы это было удобно для Твердых принципов. Однако я застрял в том, как преодолеть случай. В нашем сервисе уже есть метод, который называется GetPaymentProfile и возвращает класс с именем PaymentProfile. После интеграции мне пришлось добавить новый PaymentProfile и метод, потому что у этого нового класса есть новое свойство.

Из-за этого я получил два класса и два метода. Каждый шаг кодируется дважды без необходимости. Я просто хочу, чтобы вы посоветовали, как я могу это преодолеть.

ранее существовавший метод класс:

 public class PaymentProfile {  public String Property1 = "";  public String Property2 = "";  public String Property3 = "";  public String Property4 = ""; }  public PaymentProfile GetPaymentProfile(long aTicketType) {..}  

класс и метод, полученные после интеграции

 public class PayCorePaymentProfile {  public String Property1 = "";  public String Property2 = "";  public String Property3 = "";  public String Property4 = "";  public String Property5 = ""; }  public PayCorePaymentProfile GetPayCorePaymentProfile(long aTicketType) {..}  

Что я думал

Создание базового класса, а затем привязка всех подклассов к этому базовому классу, но я думаю, что это не подходит для данного случая. Потому что я вернул бы этот базовый класс без нового свойства.

Если я помещу все в этот базовый класс, у старой модели будет новое свойство без необходимости.

*извините за грамматические правила и ошибки

Комментарии:

1. Вам также следует подумать о том, как это будет использоваться. Будет ли вызывающий абонент использовать все свойства и, следовательно, должен проверить, какие свойства доступны? Или это просто какой-то непрозрачный фрагмент данных, который используется только где-то еще в платежной системе?

2. Как это PaymentProfile потребляется? Вам нужно определиться с общим интерфейсом.

Ответ №1:

Вам нужно сделать PayCorePaymentProfile дочерним элементом PaymentProfile. В этом случае в методе GetPaymentProfile вы сможете вернуть PayCorePaymentProfile.

 public class PaymentProfile {  public string Property1 = "";  public string Property2 = "";  public string Property3 = "";  public string Property4 = ""; }  public class PayCorePaymentProfile : PaymentProfile {  public string Property5 = ""; }  public PaymentProfile GetPaymentProfile(long aTicketType) {  if (usePayCore)  return new PayCorePaymentProfile(); // You can return a child of PaymentProfile  else  return new PaymentProfile(); // Or just return a PaymentProfile }  

Я надеюсь, это поможет.

Комментарии:

1. Я действительно благодарю вас за ваши усилия, но если я сделаю это таким образом, я не смогу связаться с Property5, потому что в PaymentProfile нет

2.Вы можете проверить, какой фактический тип был возвращен из GetPaymentProfile, и при необходимости привести его. var paymentProfile = GetPaymentProfile(someStuff); if (paymentProfile is PayCorePaymentProfile payCorePaymentProfile) Console.WriteLine($"GetPaymentProfile returned PayCorePaymentProfile, Property5 = {payCorePaymentProfile.Property5}");