2011-01-22 7 views
0

私は基本クラス(PrintProviderBase)を持っています。それはいくつかの州(PrinterUnavailableNoPaper、...)を保持します。継承の問題。どのように基本クラスの複数のインスタンスを作成するには?

それから私は、このクラスから継承:ColorPrintProviderBlackAndWhitePrintProvider ...

私は、基本クラスは、このような性質がある場合と仮定した。

private PrintStateEnum State { get; set; } 

そして、それぞれの子クラス(異なる印刷プロバイダを)それはそれ自身の状態です(何も静的ではありませんが)。共通の機能と状態をbase classにカプセル化できるように、baseクラスの1つのインスタンスがそれらの間で共有されているようですが、私はそれぞれの子クラスにbase classのコピーを持つことを意味していました。

印刷プロバイダがNoPaper状態になると、他の印刷プロバイダが不正な状態で印刷を停止します。この動作を変更するにはどうすればよいですか?

+2

。もっとコードを投稿できますか? – Todd

+0

私は 'MEF'の共有モードを使います。基本クラスには保護されたコンストラクタがあり、子クラスには基本クラスのコンストラクタを呼び出すプライベートコンストラクタがあります。 – Xaqron

答えて

1

あなたが投稿したコードでは、StateはPrintProviderBaseのプライベートであり、ColorPrintProviderなどの派生型には表示されません。

Stateにはパブリックプロパティを設定し、Composition not inheritanceを使用します。 PrintProviderのメンバー(PrintProviderBaseの名前をColorPrintProvider、BlackAndWhitePrintProviderなどに変更します)を保持します。

サンプルコード:あなたが起きてはならない説明は何

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... 
    } 
} 
2

ColorPrintProviderとBlackAndWhitePrintProviderの各インスタンスは、State値の独自のインスタンスを持ちますが、publicまたはprotectedにすることはできません(または他のプロパティやメソッドを公開しない限りそれ)。一般的に、値が静的である場合は、値はインスタンス間でのみ共有されます。

関連する問題