Довольно полный рот, но его принцип OO, с которым я боролся. Допустим, у меня есть приложение для электронной коммерции, и есть концепция способа оплаты, примерами могут быть кредитная карта, Paypal, Apple и т. Д. У пользователя есть выбор того, какой метод оплаты выбрать, поэтому мне нужно представить их все в списке на экране и в зависимости от выбора это будет использоваться для управления пользовательским интерфейсом, представляя разные тексты/изображения/взаимодействия, а также будет несколько раз сериализоваться в запросе платежа по проводу.Использование интерфейса/Наследование как маркер, когда конкретный тип представляет собой разные варианты, из которых может быть только один
Вот код:
public class PaypalPayment : PaymentMethod {
public string Token;
public string String;
}
public class CreditCardPayment : PaymentMethod {
public Address Address;
public CreditCard CreditCard;
}
interface PaymentMethod {
}
public class Booking {
public PaymentMethod PaymentMethod; //generic object
//or
public PaypalPayment PaypalPayment;
public CreditCardPayment CreditCardPayment;
}
Так что в моем классе бронирования я могу либо иметь общий объект платежа, указанный в интерфейсе, но я не могу добраться до базового типа без литья, которая засасывает, как в реальности они не разделяют общие свойства по-домашнему. В качестве альтернативы, у меня есть несколько свойств, которые чувствуют себя плохо по-другому. Пользователь может выбрать только один способ оплаты, так что остальные будут иметь нулевой или какой-то нулевой объект, мне придется либо запросить перечисление, либо спросить каждый способ оплаты, если он равен нулю. Также мой экран выбора метода оплаты немного более громоздкий, поскольку я не могу просто перебирать общий тип, я должен явно создать список.
В теории я мог бы добавить некоторые методы в интерфейс PaymentMethod, такие как Serialise() или некоторые методы представления пользовательского интерфейса, которые имеют все способы оплаты, но тогда мне придется реализовать их в моем объекте модели, t хочу сделать в моем модельном слое.
В целом у меня нет чистого решения для этого на вашем типичном ориентированном на объект языке. Я написал это в C#, но это может относиться к любому языку OO.
Проблема, которую я вижу, заключается в том, что один интерфейс не охватывает все операции/свойства, которые возможны для разных способов оплаты, в то время как они представляют одну и ту же вещь (платеж), и я не могу отбросить все это за интерфейсом. –
@ LukeDeFeo Интерфейс должен включать только самый низкий общий знаменатель между способами оплаты. Если обязанности четко определены, «Бронирование» будет использовать только этот самый низкий общий знаменатель. – guillaume31
@ LukeDeFeo, возможно, вы захотите обновить свой вопрос, заполнив пробел в «PaymentMethod» с помощью операций, которые вы планируете предоставлять. Сейчас кажется, что 'PaymentMethods' являются немыми структурами данных без поведения. – guillaume31