【问题标题】:c# Design Pattern - interacting with Basec# Design Pattern - 与 Base 交互
【发布时间】:2011-10-25 11:09:08
【问题描述】:

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

【问题讨论】:

    标签: c# design-patterns base


    【解决方案1】:
    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
    

    【讨论】:

    • 它确实改变了使用 BaseExternalDepodsition 的可能性。在 OP 代码中 BaseExternalDeposit bed = new SafeChargeDeposit();但是有效 BaseExternalDeposit bed = new SafeChargeDeposit();不会工作
    • @RuneFS,如果需要多态,可以使用接口基类。我真的没有看到这个问题。鉴于DoDeposit() 及其结果不依赖于泛型参数这一事实,这甚至可以在接口类中(如果需要作为公共方法)。我不相信这个答案有任何无法解决的问题! :)
    • 我从来没有说过有什么可以解决的。我只是说有一个常见的场景你没有满足。正如您所说,可以通过界面处理。但是,由于您还没有这样做,因此您的代码在功能上并不等同于发布的一个 OP。这是否对 OP 来说是个问题,只有他自己知道。我个人非常希望这是因为如果你总是依赖于具体类而不是最通用的基类/接口,那通常是一种强烈的错误气味。这当然与您的解决方案无关
    • @RuneFS,你当然是对的,清楚这些事情很重要。我已经更新了代码,对其进行了一些清理并提供了一个接口基础。
    • @RuneFS - 所以,您建议 DoDeposit 来自接口而不是来自 Base?谢谢
    猜你喜欢
    • 2016-07-09
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 2012-02-07
    • 2013-03-29
    • 2011-01-28
    • 2016-05-15
    • 2012-02-19
    相关资源
    最近更新 更多