Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 切换值以决定使用哪个子类_Oop_Design Patterns - Fatal编程技术网

Oop 切换值以决定使用哪个子类

Oop 切换值以决定使用哪个子类,oop,design-patterns,Oop,Design Patterns,我有一个抽象类Payment,它由几个PaymentType实现 public abstract class Payment { protected int contract; public Payment(int contract) { this.contract = contract; } public abstract bool Aprove(); } 然后,

我有一个抽象类Payment,它由几个PaymentType实现

    public abstract class Payment
    {
        protected int contract;
        public Payment(int contract)
        {
            this.contract = contract;
        }

        public abstract bool Aprove();
    }
然后,两个实现它的类

public class PaymentA : Payment
{
    public PaymentA(int contract) : base(contract)
    {
        this.contract = contract;
    }

    public override bool Aprove()
    {
        return true;
    }
}
public class PaymentB : Payment
{
    public PaymentB(int contract) : base(contract)
    {
        this.contract = contract;
    }

    public override bool Aprove()
    {
        return true;
    }
}
现在,我需要根据表单字段创建PaymentA或PaymentB

static void Main(string[] Args)
{
    int contract = 1;
    Payment payment;
    switch (rbtPaymentType)
    {
        case (int)EPaymentTypes.A:
            payment = new PaymentA(contract);
            break;
        case (int)EPaymentTypes.B:
            payment = new PaymentB(contract);
            break;
    }

    payment.Aprove(); //Use of unassigned local variable
}
我有两个问题:

1-它是否构造良好,以便我可以调用payment.Aprove(),无论它是哪种类型的付款

2-如果对象未初始化,如何进行方法调用?我得到错误“使用未分配的局部变量”

提前谢谢

1-它是否构造良好,以便我可以调用payment.Aprove(),无论它是哪种类型的付款

是的,对于简单的应用它是可以的。如果您想让它更好一点,可以使用简单的工厂,如:

public class PaymentFactory
{
    public Payment CreatePayment(int rbtPaymentType, int contract)
    {
        switch (rbtPaymentType)
        {
            case (int)EPaymentTypes.A:
                return new PaymentA(contract);
            case (int)EPaymentTypes.B:
                return new PaymentB(contract);
            default:
                throw new Exception("Unknown payment type");
        }
    }
}
class Program
{
    static void Main(string[] Args)
    {
        int contract = 1;
        Payment payment = null;
        int rbtPaymentType = 1;
        PaymentFactory paymentFactory = new PaymentFactory();
        payment = paymentFactory.CreatePayment(rbtPaymentType, contract);
        payment.Aprove();
    }
}
无论何时切换某个对象以创建新实例,都应该考虑将其封装在factory中。这样,如果您想创建另一个支付实例,就不必在其他位置重复相同的切换

2-如果对象未初始化,如何进行方法调用?我得到错误“使用未分配的局部变量”

您可以将其分配给null,如上面的示例所示

顺便说一句,您不必在PaymentA和PaymentB的构造函数中指定合同成员,因为基类会为您指定