一个满嘴的问题,但它是我一直在努力解决的 OO 原则。假设我有一个电子商务应用程序并且有支付方式的概念,例如信用卡、Paypal、Apple pay 等。用户可以选择选择哪种支付方式,所以我需要将它们全部显示在一个列表中在屏幕上,根据选择的不同,这将用于驱动 UI,呈现不同的文本/图像/交互,并且将通过稍微不同的方式序列化为在线支付请求。
这是一些代码:
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() 或所有支付方法共有的一些 UI 表示方法,但是我必须在我不想做的模型对象中实现它们在我的模型层。
总的来说,我在典型的面向对象语言中没有一个干净的解决方案。我用 c# 编写了这个,但这可以适用于任何 OO 语言。