如何通过Switch值选择抽象类Payment的具体实现子类?
没问题!要根据Switch值来选择对应的Payment子类实例,这其实是很常见的场景,我给你两种实用的实现方案,你可以按需选择:
首先先帮你补全PaymentB的代码(不然编译会报错):
public class PaymentB : Payment { public PaymentB(int contract) : base(contract) { // 注意:base(contract)已经完成了contract的赋值,不需要重复写this.contract = contract } public override bool Aprove() { // 这里实现PaymentB的审批逻辑,示例返回false return false; } }
方案一:直接用Switch语句实现(直观易理解)
这种方式适合子类数量不多、变动不频繁的场景,直接通过Switch分支创建对应实例:
首先建议定义一个枚举来规范支付类型(当然你也可以用int/string作为判断标识):
public enum PaymentType { PaymentA, PaymentB }
然后写一个工厂方法,用Switch判断并创建实例:
public static Payment CreatePayment(PaymentType paymentType, int contractId) { switch (paymentType) { case PaymentType.PaymentA: return new PaymentA(contractId); case PaymentType.PaymentB: return new PaymentB(contractId); default: throw new ArgumentOutOfRangeException(nameof(paymentType), "暂不支持该支付类型"); } }
使用的时候非常简单:
// 假设你从业务逻辑中拿到选中的支付类型,比如PaymentA PaymentType selectedType = PaymentType.PaymentA; Payment payment = CreatePayment(selectedType, 10001); bool isApproved = payment.Aprove();
方案二:字典映射实现(更灵活易扩展)
如果后续需要新增更多Payment子类,这种方式不需要修改原有Switch逻辑,只需要添加字典项即可,符合开闭原则:
// 定义静态字典,存储支付类型到实例创建方法的映射 private static readonly Dictionary<PaymentType, Func<int, Payment>> _paymentFactoryMap = new Dictionary<PaymentType, Func<int, Payment>> { { PaymentType.PaymentA, contract => new PaymentA(contract) }, { PaymentType.PaymentB, contract => new PaymentB(contract) } }; public static Payment CreatePaymentWithMap(PaymentType paymentType, int contractId) { if (_paymentFactoryMap.TryGetValue(paymentType, out var createMethod)) { return createMethod(contractId); } throw new ArgumentOutOfRangeException(nameof(paymentType), "暂不支持该支付类型"); }
使用方式和方案一完全一致,后续新增PaymentC时,只需要在字典中添加一行:
{ PaymentType.PaymentC, contract => new PaymentC(contract) }
最后提醒一下:父类Payment的构造函数已经给contract字段赋值了,所以子类构造函数里不需要重复写this.contract = contract,避免冗余代码~
内容的提问来源于stack exchange,提问作者Alex Nungon
相关产品推荐
相关产品推荐

