继承问题。如何创建基类的多个实例?

时间:2011-01-22 03:50:13

标签: c# inheritance base-class

我有一个基类(PrintProviderBase)。它包含一些州(PrinterUnavailableNoPaper,...)。

然后我继承了这个课程:ColorPrintProviderBlackAndWhitePrintProvider ...

我被假设如果基类具有这样的属性:

private PrintStateEnum State { get; set; }

然后每个子类(不同的打印提供者)都拥有自己的状态(尽管没有任何东西是静态的)。似乎base类的一个实例在它们之间共享,而我的意思是在每个子类中都有base class的副本,因此可以将通用功能和状态封装到base class中。

现在,如果打印提供程序进入NoPaper状态,则其他打印提供程序因状态错误而停止打印。我该如何改变这种行为?

2 个答案:

答案 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...
     }
}