2016-03-29 7 views
2

以下の擬似C#コードを考える呼び出し場合に警告を生成する:(Work()メソッドをオーバーライド)派生クラスがWork()メソッドを呼び出すことは、この設計で防止/サブクラスがオーバーライド部材

public abstract class Worker 
{ 
    public void DoWork() 
    { 
     Prepare(); 
     Work(); 
     Cleanup(); 
    } 

    protected abstract void Work(); 
} 

、それが可能です直接。

私はどのようにサブクラスがこの呼び出しを行うか、または少なくともコンパイラの警告を生成しないようにするためのヒントを探しています。

なぜ私はこれをしたいですか? ワーカーは実際にWork()を別のスレッドにディスパッチします。 DoWork()はロックに注意します。


私は知っている、これは奇妙です。 Work()は、DoMyWork()へのメソッド呼び出しで構成され、そのオブジェクトはDoMyWork()を別の場所に呼び出す可能性があります。それを傍受することは不可能です。

とにかく。私はその問題に関する考えを感謝します。

+0

それは役に立ちますか? [これをチェックしてください](http://stackoverflow.com/questions/5274639/preventing-override-of-individual-methods-in-c-sharp) –

+0

あなたは、(あなたのユースケースを脇に)それは統合失調症自身が実装するメソッドを実行するオブジェクト(抽象クラ​​スの場合は、オーバーライドしないでメソッドを実装します)。私はユースケースについていくつかの時間を考えるだろうが、私はそれを達成する方法がないと確信している。 – dryman

+1

代わりに 'Work'をイベントにすると考えましたか? – Eris

答えて

1

エリスのおかげとコーリー私はそれを考え出したと思う。この方法はどうですか:

public abstract class Worker 
{ 
    public void DoWork() 
    { 
     if (Work != null) 
     { 
      Prepare(); 
      Work(); 
      Cleanup(); 
     } 
    } 

    protected Action Work { private get; set; } 
} 

public class ImplWorker { 
    public ImplWorker() { 
     Work = //whatever 
    } 
} 

まだ彼は彼が本当に他の場所やものに保存することができたら。しかし、それは私が想像できる限り遠くに行きます。

+1

これは、以前にWorkerから継承したクラスを破棄します。もしあなたがそれをやろうとするならば、あなたは先に進んでメソッドを完全に削除するかもしれません。 – returnsvoid

+0

あなたはいつも変化を壊すことに終わる前に可能だった何かを禁止したいのですか、あるいは目的を誤解していますか? – dryman

+0

これは私が「それを間違った方法で使用するのを防ぐのに十分な努力」と考えていると思います。ありがとう! – thomai

0

作業は、リソース(例えば、リモート・サーバー、データベース接続)を使用して行われる、またはあなたがこのようにそれを行うことができ、そのように変更することができます場合は、次の

public interface IResource 
{ 
} 

public abstract class Worker 
{ 
    private class TheResource : IResource 
    { 
     // implement 
    } 

    public void DoWork() 
    { 
     Prepare(); 

     var resObj = new TheResource(); 
     Work(resObj); 
     // if needed, cleanup/dispose resObj here 

     Cleanup(); 
    } 

    protected abstract void Work(IResource resourceObj); 
} 
0

これはややハックですが、メソッドを仮想に変更し、新しいメソッドを呼び出すボディを追加してからObsoleteAttributeを追加することができます。

protected void DoWork() 
    { 
     // New method 
    } 

    [Obsolete("This method is deprecated.")] 
    protected virtual void Work() 
    { 
     DoWork(); 
    } 

このメソッドを仮想としてマークすると、以前はWork()をオーバーライドする必要があったため、既存の子クラスが破損することはありません。

関連する問題