2 votes

Valeur de commutation pour décider de la sous-classe à utiliser

J'ai une classe abstraite, Payment, qui est mise en œuvre par plusieurs PaymentTypes.

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

        public abstract bool Aprove();
    }

et ensuite, deux classes qui l'implémentent

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;
    }
}

Maintenant, j'ai besoin de créer le paiement A ou le paiement B en fonction d'un champ du formulaire.

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
}

J'ai deux questions :

1 - Est-il bien construit pour que je puisse appeler payment.Aprove() quel que soit le type de paiement ?

2 - Comment puis-je faire l'appel de méthode si l'objet n'est pas initialisé ? J'obtiens l'erreur "Use of unassigned local variable".

Merci d'avance

0voto

1 - Est-il bien construit pour que je puisse appeler payment.Aprove() quel que soit le type de paiement ?

Oui, pour une application simple, c'est correct. Si vous voulez l'améliorer un peu, vous pouvez utiliser une simple usine comme ceci :

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();
    }
}

Chaque fois que vous passez à quelque chose pour créer une nouvelle instance, vous devez penser à l'encapsuler dans une fabrique. De cette façon, vous n'aurez pas à répéter la même opération à un autre endroit si vous voulez créer une autre instance de Payment.

2 - Comment puis-je faire l'appel de méthode si l'objet n'est pas initialisé ? J'obtiens l'erreur "Use of unassigned local variable".

Vous pouvez l'assigner à null comme je l'ai montré dans l'exemple ci-dessus.

En fait, vous n'avez pas besoin d'assigner le membre du contrat dans les constructeurs de PaymentA et PaymentB puisque la classe de base le fait pour vous.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X