Search code examples
c#design-patternsradix

c# Design Pattern - interacting with Base


I have a class SafeChargeDeposit inheriting from BaseExternalDeposit.
the BaseExternalDeposit require in its constructor a variable type BaseDepositStructure.

Since It requires BaseDepositStructure I cant use its child's elements in SafeChargeDeposit.

this is the code:

 abstract class BaseExternalDeposit
    {
        public abstract BaseExternalDepositResult DoDeposit();

        protected BaseDepositStructure depositStructure;

        public BaseExternalDeposit(BaseDepositStructure depositStructure)
        {
            this.depositStructure = depositStructure;
        }
    }


 class SafeChargeDeposit : BaseExternalDeposit
 {
       public SafeChargeDeposit(CreditCardDepositStructure depositStructure):base(depositStructure){}

       public override BaseExternalDepositResult DoDeposit(){

        /////// I CAN USE THIS MEMBER:
        depositStructure.Amount = 50;

        /////// BUT I CANNOT USE THIS MEMBER:
        depositStructure.CreditCardNumber = "123456"; 
       }
 }


public class BaseDepositStructure
    {
        public double Amount = 0.0;
    }

    public class CreditCardDepositStructure : BaseDepositStructure
    {
        public string CreditCardNumber = string.Empty;
    }

I understand why I can use depositStructure.Amount and can't use depositStructure.CreditCardNumber ... But what is wrong with my design here? how can I solve this issue and keep the flexibility of using Bases.


Solution

  • interface IBaseExternalDepositResult
    {
    };  // eo interface BaseExternalDepositResult
    
    interface IDeposit
    {
        void Deposit();
    };
    
    // class BaseExternalDeposit<>
    abstract class BaseExternalDeposit<B> : IDeposit where B : BaseDepositStructure
    {
        private B depositStructure_;
        protected abstract IBaseExternalDepositResult DepositImpl();
        protected B Structure { get { return depositStructure_; } }
    
        public BaseExternalDeposit(B depositStructure)
        {
            depositStructure_ = depositStructure;
        }   // eo ctor
    
    
        // IDeposit
        void Deposit()
        {
            DepositImpl();
        }
    }   // eo class BaseExternalDeposit<B>
    
    
    // class SafeChargeDeposit
    class SafeChargeDeposit : BaseExternalDeposit<CreditCardDepositStructure>
    {
        protected override IBaseExternalDepositResult DepositImpl()
        {
            Structure.Amount = 50;
            Structure.CreditCardNumber = "123456";
        }   // eo DepositImpl
    
    
        public SafeChargeDeposit(CreditCardDepositStructure depositStructure)
            : base(depositStructure)
        {
        }
    }   // eo class SafeChargeDeposit
    
    
    public class BaseDepositStructure
    {
        public double Amount = 0.0;
    }
    
    public class CreditCardDepositStructure : BaseDepositStructure
    {
        public string CreditCardNumber = string.E