我有一个基类(PrintProviderBase
)。它包含一些州(PrinterUnavailable
,NoPaper
,...)。
然后我继承了这个课程:ColorPrintProvider
,BlackAndWhitePrintProvider
...
我被假设如果基类具有这样的属性:
private PrintStateEnum State { get; set; }
然后每个子类(不同的打印提供者)都拥有自己的状态(尽管没有任何东西是静态的)。似乎base
类的一个实例在它们之间共享,而我的意思是在每个子类中都有base class
的副本,因此可以将通用功能和状态封装到base class
中。
现在,如果打印提供程序进入NoPaper
状态,则其他打印提供程序因状态错误而停止打印。我该如何改变这种行为?
答案 0 :(得分:2)
ColorPrintProvider和BlackAndWhitePrintProvider的每个实例都有自己的(和不同的)State值实例,尽管它们都不能访问它,除非你公开或保护它(或者提供暴露它的其他属性或方法) )。通常,如果值是静态的,则只能在实例之间共享该值。
答案 1 :(得分:1)
在您发布的代码中,State是PrintProviderBase的私有,并且对于ColorPrintProvider等派生类型不可见。
使State成为公共属性并使用Composition而不是继承。在ColorPrintProvider,BlackAndWhitePrintProvider等中保留PrintProvider的成员(从PrintProviderBase更改名称)。
示例代码:
public class PrinterState
{
public Boolean IsPaperTrayEmpty { get; set; }
public Int32 CartridgeLevel { get; set; }
}
public class ColorPrintProvider
{
public PrinterState CurrentState { get; private set; }
private void UpdateCurrentState()
{
// update the current state
// based on / after some events like RequestForPrint, PrintCompleted...
}
}