2017-11-16 6 views
1

抽象Work()メソッドを使用してジョブベースクラスを取得しました。これは、継承されたクラスでオーバーライド/実装されます。すべての派生クラスに繰り返し条件付きチェックを適用する

達成したいのは、すべての派生クラスにアボート条件を適用することです。テンプレートのメソッドパターンは私の抽象的なWork()クラスで発生するようにこのチェックが必要なので、ここで私を助けてくれないようです。

この問題を回避するには、ワーク()仮想を作っていないことになるが、その後、私はもはや(私が何をしたいのか)、それの実装を強制しています:

public abstract class First 
{ 
    protected virtual void Work() 
    { 
     //do stuff 
    } 
} 

public class Second : First 
{ 
    protected override void Work() 
    { 
     base.Work(); 
    } 
} 

は私の目標を達成する方法はありますか?

+0

それは伝えるのは難しいです:派生クラスでのチェックが成功した時に何をすべきかの実際の実装を提供するだろうが仕事を中断可能性があり、この方法ですべてのチェックは、基本クラスのWork機能で実行されるであろうあなたは正確に何をしたいのですが、キャンセルチェックを行い、派生クラスに実装されている 'protected abstract void WorkInternal()'を呼び出す 'First'の' public void Work() 'はどうでしょうか? – Blorgbeard

答えて

2

テンプレートメソッドパターンは、私はあなたが右のパターンを選んだ

Work()私の抽象的に発生する場合は、このチェックを必要とするので、ここで私を助けていないようですが、あなたはそれを正しく適用されませんでした。

テンプレートメソッドパターンの背後にある考え方は、Workを非仮想にし、サブクラスがオーバーライドするための別のメソッドvirtualまたはabstractを提供することです。

public abstract class First { 
    public void Work() { 
     if (!CheckPreconditions()) { 
      // Abort the job 
      return; 
     } 
     DoWork(); 
    } 
    protected abstract void DoWork(); 
} 

public class Second : First { 
    protected override void DoWork() { 
     // Do the actual work here 
    } 
} 
関連する問題