Шаблон проектирования c # - взаимодействие с Base - PullRequest
2 голосов
/ 25 октября 2011

У меня есть класс SafeChargeDeposit, унаследованный от BaseExternalDeposit.
BaseExternalDeposit, требующий в своем конструкторе тип переменной BaseDepositStructure.

Поскольку требуется BaseDepositStructure Я не могу использовать дочерние элементы в SafeChargeDeposit.

, это код:

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

Я понимаю, почему я могу использовать depositStructure.Amount и не может использовать depositStructure.CreditCardNumber ... Но что не так с моим дизайном здесь?Как я могу решить эту проблему и сохранить гибкость использования Базы.

1 Ответ

4 голосов
/ 25 октября 2011
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
...