繁体   English   中英

c#设计模式-与基础交互

[英]c# Design Pattern - interacting with Base

我有一个类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 ...但是这里的设计有什么问题? 如何解决此问题并保持使用Base的灵活性。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM