【问题标题】:Inheritance problem. How to create multiple instances of a base class?继承问题。如何创建基类的多个实例?
【发布时间】:2011-01-22 03:50:12
【问题描述】:

我有一个基类 (PrintProviderBase)。它拥有一些状态(PrinterUnavailableNoPaper、...)。

然后我从这个类继承:ColorPrintProviderBlackAndWhitePrintProvider ...

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

private PrintStateEnum State { get; set; }

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

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

【问题讨论】:

  • 您所描述的不应该发生。你能发布更多代码吗?
  • 我使用MEF的共享模式。基类有一个受保护的构造函数,子类有调用基类构造函数的私有构造函数。

标签: c# inheritance base-class


【解决方案1】:

ColorPrintProvider 和 BlackAndWhitePrintProvider 的每个实例都有自己的(且不同的)State 值实例,但除非您将其设为公共或受保护(或提供其他公开它的属性或方法,否则它们都无法访问它) )。一般来说,只有静态的值才会在实例之间共享。

【讨论】:

    【解决方案2】:

    在您发布的代码中,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...
         }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 2011-10-26
      • 2013-07-27
      • 1970-01-01
      相关资源
      最近更新 更多