2011-07-05 9 views
1

私はかなり新しい.Netです。ここで間違ったことをしています。C#の抽象メソッドをオーバーライドするデリゲートを実装します。

public delegate bool DEnqueue(ref IPCPriorityMessage item, byte priority); 

...と、次のメソッド宣言:私の基本抽象クラスでは、私は、次のデリゲート持っ

public override DEnqueue Enqueue; 
:私のインスタンスクラスで

public abstract DEnqueue Enqueue(); 

を、私は以下の持っています

I point適用可能なローカルメソッドにエンキューします。継承を使用しない場合や代理人を使用しない場合にのみ、これを機能させることができます。

私の正確な目的は次の通りである。

  1. は、デザインパターンを強制的に基本抽象クラスを使用します。インスタンスには、Engueue()メソッドが含まれている必要があります。
  2. インスタンスクラスの代理人を使用して、公開Enqueue()メソッドが呼び出されたときに適用可能なprivate enqueue()メソッドが呼び出されるようにします。

どうすればよいですか?私はインターフェイスを使ってみましたが、基本的に同じ問題があります。

注:私は実行時にプライベートenqueue()を使用することしか知っていないので、代理人の私の使用。

答えて

2

Template Method Patternを探しているようです。代理人を使う必要はありません。

+0

他はすべてテンプレートです。しかし、デリゲートを使用せずに、私はダブルコール、すなわちパブリックインスタンスメソッド+ 1をデリゲート(またはif文)を介して内部メソッドに送る必要があります。 – IamIC

+0

はい。それは悪いですか? 2番目の呼び出しは最初のメソッド内で発生するので、呼び出し元にはわかりません。 –

+0

悪くないです...ちょっとしたオーバーヘッドではありません。私がしようとしていることはできないのですか? – IamIC

1

まず、基本クラスのメソッド宣言は、あなたが考えるものをおそらく言いません。つまり、Enqueueメソッドは、タイプが​​のデリゲートを返しますが、そのメソッドはデリゲートと同じ型ではありません。

private DEnqueue m_enqueue; 

public override DEnqueue Enqueue 
{ 
    get { return m_enqueue; } 
} 
:その後、デリゲートを使用してそれを実装

public abstract DEnqueue Enqueue { get; } 

あなたが(または実際に持っている)ことができます:あなたは何ができるか

は、お使いのベースクラスでタイプ​​の性質を持つことです

メソッドを呼び出すのと同じ方法で、デリゲートをプロパティで呼び出すことができます。

+0

ありがとうございます。このパターンが典型的なテンプレートメソッドパターンで非デリゲートを使用するよりも速いのかどうか知っていますか? (他の答えとして) – IamIC

+1

@IanC、このようなパフォーマンスについて尋ねると、早すぎる最適化の匂いがします。あなたのケースに適したデザイン(テンプレートメソッドのパターンになる可能性が高い)を使用してください。しかし、あなたが本当に知っている必要があるのは、デリゲートを呼び出すことは通常のメソッドを呼び出すことよりも遅いため、デリゲートを使用することは(おそらく測定不可能なほど)遅くなることです。一方、正しいメソッドを選択する条件が遅い場合は、代理人の使用が高速になる可能性があります。 – svick

関連する問題