c#设计模式-与基础交互
我有一个类c#设计模式-与基础交互,c#,design-patterns,base,C#,Design Patterns,Base,我有一个类SafeChargeDeposit继承自BaseExternalDeposit BaseExternalDeposit在其构造函数中需要变量类型BaseDepositStructure 因为它需要BaseDepositStructure我不能在SafeChargeDeposit中使用它的子元素 代码如下: abstract class BaseExternalDeposit { public abstract BaseExternalDepositResult
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;
}
我明白为什么我可以使用存款结构。金额而不能使用存款结构。信用卡号。。。
但是我的设计有什么问题吗?如何解决此问题并保持使用基的灵活性。接口IBaseExternalDepositionResult
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
{
}; // eo接口BaseExternalDepositResult
接口IDeposit
{
无效存款();
};
//类基外部存款
抽象类BaseExternalDeposit:IDeposit,其中B:BaseDepositStructure
{
私人银行存款结构;
受保护的抽象IBaseExternalDepositResult DepositImpl();
受保护的B结构{get{return depositStructure_;}
公共基础外部存款(B存款结构)
{
沉积结构=沉积结构;
}//行政长官
//设想
无效存款()
{
DepositImpl();
}
}//eo类BaseExternalDeposit
//类别保险费押金
类别SafeChargeDeposit:BaseExternalDeposit
{
受保护的覆盖IBaseExternalDepositResult DepositImpl()
{
结构。金额=50;
Structure.creditcardname=“123456”;
}//eo预存
公共保险费存款(信用卡存款结构存款结构)
:基础(结构)
{
}
}//eo类保险费押金
公共类基类结构
{
公共双倍金额=0.0;
}
公共类CreditCardDepositStructure:BaseDepositStructure
{
公共字符串CreditCardNumber=string.E
它不会改变使用BaseExternalDeposition的可能性。在OPs中,代码BaseExternalDeposit bed=新的SafeChargeDeposit();是否有效?BaseExternalDeposit bed=新的SafeChargeDeposit());不会work@RuneFS,如果需要多态性,则可以使用接口基类。我真的看不出问题所在。考虑到DoDeposit()
及其结果不依赖于泛型参数的事实,这甚至可能在接口类中(如果它是作为公共方法需要的话)。我不相信这个答案有任何无法解决的问题!:)我从来没有说过有什么问题可以解决。我只是说,有一个常见的场景你没有考虑。正如你所说,它可以通过一个接口来处理。但因为你没有这样做,你的代码在功能上并不等同于一个操作发布。这是否是OP的问题,只有他知道。我个人非常希望这是因为如果你总是依赖于具体类而不是最通用的基类/接口,那么通常会有一种强烈的气味,说明有些问题。这与你的解决方案无关course@RuneFS,你是对的,当然这很重要为了弄清楚这些事情。我已经更新了代码,对其进行了一些清理,并提供了一个接口基础。@RuneFS-那么,您建议DoDeposit将来自接口而不是基础?谢谢