2011-02-01 19 views
10

抽象メソッドを使用して抽象クラスを作成しています(したがって、それを継承するすべてのクラスはそのメソッドを実装する必要があります)。しかし、私はメソッドが使用する必要があるパラメータを指定する必要はありません。それぞれのメソッドには異なるパラメータが使用される場合もあります。名前と戻り値だけが同じでなければなりません。パラメータを指定せずに抽象メソッドを定義する

C#でこれを行う方法はありますか?

ありがとうございました!

答えて

16

いいえ、それは意味がありません。パラメータを宣言していない場合は、基本クラスへの参照のみが与えられたメソッドを呼び出すことはできません。それは抽象メソッドの要点です。呼び出し側が具体的な実装を気にすることなく、使用するAPIを提供できるようにすることです。

発信者が正確なメソッドシグネチャを知る必要がある場合、その呼び出し元を具体的な実装に結び付けているため、抽象化は本質的に役に立たなくなります。

さらに詳しい情報があれば、より適切なアプローチを提案できますか?

public class Foo<T> 
{ 
    public abstract void Bar(T t); 
} 

コンクリートのサブタイプは、どちらか一般的なこと、あるいは、例えばFoo<string>から派生することができます:たとえば、あなたは、ジェネリック型を作ることができるかもしれません。

+0

それぞれの子は、このタイプの入力を取り入れることができるが、同じタイプの出力を生成するこのメソッドの実装を作成する必要があります。したがって、出力を使用して自分のプログラムのロジックを実行することができます。 – TheBoss

+2

@TheBoss:抽象クラス(インタフェースのような)のポイントは、共通の機能の...よく..抽象化を可能にすることです。 "あなたは' 'Foo'という関数を必要とするようなものを定義するために使うことはできません。*いくつかの*(またはいいえ)パラメータをとり、' int'を返します。そのような関数は、その署名が未定義であるため、抽象化することはできません。特定のシグネチャが定義されているレベルより高いレベルでクラスを参照するコードから(非反映的に)呼び出すことは不可能であり、抽象を破棄する。 –

+0

@ TheBoss:Jonが投稿したコード例のように、Genericを使用して設計の課題を解決する方法を検討する必要があります。 – code4life

0

いいえ、ありません。

メソッドをオーバーライドするには、メソッドのシグネチャと一致する必要があります。これにはメソッド名と書式パラメータが含まれます。

1

あなたがしようとしているのはコードの匂いです。

抽象クラスにISupportInitializeを実装し、抽象的なAct()メソッドを実装するのが、より良いパターンです。

BeginInitEndInitの間の呼び出しでは、あなたの子供が行動する準備ができているということです。情報のさまざまなビットを集めて、あなたはランダムな型と引数の数を詰め込もうとしています。設定が完了し、EndInitが呼び出されると(ここで検証)、Act()アブストラクトを呼び出すことができます。

また、これを実行しないでくださいしてください:あなたはこのような何かを行う場合

public abstract void Act(params object[] arguments); 

人々はあなたを追い詰めるでしょう。

+0

それは面白いアプローチです。だから私は初期化が完了したときを示すクラス内のブール型フィールドを持ち、その後Act()メソッドは正常に実行しなければ例外をスローします。 – TheBoss

+0

@ TheBoss標準的な手法は、EndInitのインスタンスの状態を確認し、正しい状態でない場合にスローすることです。このインターフェイスを実装する型は、多くの場合、EndInitを呼び出した後に不変になります。 – Will

関連する問題