2010-12-07 6 views
0

私は全体の "インターフェイスへのプログラミング"方法論に固執しようとしており、インターフェイスを使用して私のWindowsフォームアプリケーションでいくつかの別個のアクションを構成したいと考えていました。インターフェイスを使用して継承を構造化する手助けが必要ですか?

基本的に、私は私がダウンして伝播するでしょうIActions上のexecute()メソッドを持っていると思ったこの

        IActions 
       |----------------------------------------| 
     IValidateAction       IExecuteAction 
    |----------------------|    |----------------------| 
IIis6Validate   IIis7Validate IIis6Actions   IIis7Actions 
          |          | 
       |--------------------|     |---------------------| 
     ValidateWebCreation      CreateWebsite 

ように決裂した構造を有しています。私は基本的な抽象クラスでそれを行うことができると知っていますが、再び「インターフェイスへのプログラム」方法論に従いたいと思っていました。(インターフェイス)のインスタンスを注入するというアイデアが好きで、いつでもオブジェクトがそのオブジェクトが同じ基本インターフェースから継承されている間は長くなります。

しかし、私はあなたがインターフェイスからのクラス継承を持っている時に実施契約は別のインターフェイスを継承するインタフェースにadhererいないことが判明。私はまた、InterfaceBがInterfaceAと互換性がある限り、別の投稿を読んだ。これはここに当てはまりますか?

このツリーは使用できますか? クラスの継承を使用するか、このツリーを別のツリー構造に分割する必要がありますか?別のインターフェイスから継承するインタフェースについて

+2

FYIの「プログラミングインタフェース」は、現代のプログラミング言語ではわかっているように、インタフェースを意味するものではありません。 「インタフェース」は、クラスのパブリックメソッドとプロパティです。インターフェイスへのプログラミングは、通常、クラスの階層を意味し、それを使用するコードでは、具体的な具体的なクラスではなくインターフェイスするようにプログラミングします。つまり、定義する変数は基本クラスの型ですが、作成するインスタンスは子孫のいずれかになります(したがって、多態性が可能になります)。 –

+0

インターフェイスと「契約」に関しては、http://blogs.msdn.com/b/kcwalina/archive/2004/10/24/246947.aspx –

答えて

3

:あなたは

interface IA 
{ 
    void A(); 
} 

interface IB : IA 
{ 
    void B(); 
} 

を持っている場合

IBを実装するクラスは、ABの両方を実装する必要があります。それらが単なる宣言であるので、IAからの宣言を明示的に繰り返す必要はありません。IBです。 IBは、とにかくIAからすべてを必要とします。

インターフェイス階層を使用しても問題はありません。側としてとして

を使用する(一部またはすべてのインターフェイスのために)、対応するインターフェースを実装平行抽象クラス階層を作成できます。これは、いくつかのメソッドの宣言だけでなく、いくつかの実装を共有したい場合に関係します。

0

これはかなり複雑なインターフェース構造のようです。ここで定義している各インターフェイスは、実際には本質的に意味があり便利ですか?下位レベルのインタフェースでは、そのような程度の特異性が必要であり、それ以上のレベルのインタフェースは有用であるほど特有のものですか?

は、私はあなたが別のインターフェイスを拡張するインタフェースはクラスと同じ「契約の執行」を負わないことを言うときに言及しているかわからないんだけど。インターフェースは何も実装していないので、あるインターフェースを別のインターフェースから派生させるには、単にクラスを実装することによって実装されなければならないコントラクトを拡張するだけです。親インタフェースのメンバは、子インタフェースによって指定されたコントラクトに暗黙的に含まれます。たとえば:BAからFooを "継承" するので

interface A 
{ 
    void Foo(); 
} 

interface B 
{ 
    void Bar(); 
} 

class C : B 
{ 
    void Foo(); 
    void Bar(); 
} 

クラスCは、FooBarの両方を実装する必要があります。

明示的なインターフェイスの実装を調べることもできます。 hereおよびhereを参照されたい。

更新:メソッドがより具体的な実装で異なるパラメータを使用する場合は、おそらくインタフェース構造を再考する必要があります。一歩踏み込んで、IActionが表すものとクライアントコードがどのように使用するかを考えてみましょう。

例えば、IActionは、パラメータを持たない一般的なExecute()メソッドを定義し、IActionのより具体的な派生物は、パラメータを持つより具体的なメソッドを定義します。

「一般的な」Execute()の方法は何ですか?特定の実装のそれぞれは実際にメソッドのパラメータの形で追加情報を必要とするため、パラメータなしのExecute()はどうしたらよいでしょうか?

+0

を参照してください。複雑すぎるかもしれません。私はちょうど私がいくつかのフィードバックのためにここに回っていた理由thatsプログラミング/ C#にちょうど新しいです。多分 – pghtech

+0

に減らすべきですか?IIs6WebsiteValidation:IIisValidation – pghtech

+0

抽象クラスおよび/または仮想メソッドを使用して、さまざまなバリエーションを実装できますか?だから私は、階層の最上位にあるExecuteメソッドを見ていますが、クラスレベルまたはベースクラスでは、異なるパラメータを取るかもしれません。 – pghtech

関連する問題