You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:06:43