|
分類:[C#]
現在C#で、印刷を行うものを作成中です。 その中でほぼ同じ内容の帳票を2種類印刷しなくてはならず、その実装方法で悩んでいます。 2種類の違いは罫線の色と、文字列が多少違うという程度です。 なので、PrintDocumentを継承した共通部分を描画するクラス(PrintDocumentBaseクラス)を作成し、 それを継承したRedPrintDocumentクラス、BluePrintDocumentクラスを作成してみました。
それぞれ以下のようにしてみました。
public class PrintDocumentBase : PrintDocument { Color borderColor; Font fntMincho; Pen borderPen; Brush brush; Graphics grp;
protected PrintDocumentBase(Color borderColor) { this.borderColor = borderColor; }
protected override void OnBeginPrint(PrintEventArgs e) { base.OnBeginPrint(e); fntMincho = new Font("MS 明朝", 25); borderPen = new Pen(borderColor); brush = Brushes.Black; }
protected override void OnEndPrint(PrintEventArgs e) { base.OnEndPrint(e); fntMincho.Dispose(); borderPen.Dispose(); brush.Dispose(); grp.Dispose(); }
protected override void OnPrintPage(PrintPageEventArgs e) { base.OnPrintPage(e); grp = e.Graphics; DrawBorder(); DrawCommonString(); }
private void DrawCommonString() { grp.DrawString("てst", fntMincho, brush, 10, 10); }
private void DrawBorder() { grp.DrawRectangle(borderPen, 10, 10, 100, 100); grp.DrawRectangle(borderPen, 110, 10, 100, 100); } }
public class RedPrintDocument : PrintDocumentBase { private RedPrintDocument(Color color):base(color) { } }
public class BluePrintDocument : PrintDocumentBase { private BluePrintDocument(Color color) : base(color) {
} }
しかしこれではRed、Blueを扱う際に new RedPrintDocument(Color.Red) と書かなければならず、ものすごく気持ち悪い実装(RedPrintDocumentクラスなのにコンストラクタで赤を指定)になってしまいます。
そこでPrintDocumentBaseクラスに abstract static PrintDocument CreateInstance() というようなメソッドが定義できれば私のやりたい事(コンストラクタでColorを指定する事の隠ぺい)が達成されるかと思いましたが、 当然のようにエラーになりました。
また、Factoryパターンを適用できればいいのかも?と思いましたが デザインパターンを適用した経験がなく、実装できませんでした。
どのようにするのが良いのかが全く見えなくなってしまったので、どなたかご教示頂きたいと思います。
|