2012-02-01 19 views
3

インターフェイスを使用してすべてが実装されているように見えますが、私は頭を悩ましていますそれら。インターフェイスを使用してAPIを把握していません

public partial class Form1 : Form, IFoo 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Guid jobID = AddBarToFoo(fooID, barPath); 
    } 

    public Guid IFoo.AddBarToFoo(string fooID, string barPath) 
    { 
     throw new NotImplementedException(); 
    } 

だから、基本的な構造です。 Visual Studioは親切にインターフェイスを実装しており、AddBarToFooメソッドを呼び出すことができます。すばらしいです。

しかし今は何ですか?明らかに、メソッドはいくつかのコードを必要とするvoidですが、どのようなコードですか?そのメソッドでインスタンス化するオブジェクトのAPIを精査する必要がありますか?それとも、私は間違った道を完全に下っていますか?

+0

'Guid'を返すべきです、' void'ではありません。基本的に、 'API'はこのインタフェースを知っており、実装されている型のメソッドを呼び出すことができます。つまり、そのGuidをどのように生成するかは仕様にあるはずです。 –

+0

コードは、製品の仕様に応じて任意に設定できます。 – JConstantine

答えて

4

これはインターフェイスを持つものです。彼らは誰かがどのようにそれらを呼び出すかを定義するだけです。彼らは絶対に言う何も方法は本当に何をすべきか、またはどのようにそれを行う必要があります。それは決定するためにインターフェースを実装する人の責任です。

VSは、実際にコンパイラを満たすだけの単一行throw new NotImplementedException();を追加することでメソッドを "実装"します。

完全に異なることを実現する(考えられる)2つの実装があります。 IFooを実装両方:

public class DbFoo:IFoo { 
    public Guid IFoo.AddBarToFoo(string fooID, string barPath) { 
     // this might add a Foo to the database and return its Guid 
    } 
} 

public class ListBasedFoo:IFoo { 
    public ListBasedFoo() { MyList = new List<Foo>(); } 

    public List<Foo> MyList { get; private set; } 

    public Guid IFoo.AddBarToFoo(string fooID, string barPath) { 
     // this could add a Foo to MyList, and return some Guid to reference it 
    } 
} 

編集...あなたはインタフェースが抽象行動が重要ですが、実装が異なることができる場所で多くを使用し表示されます。たとえば、オブジェクトを永続化するためのインタフェースです。開発中に、メモリ内のリストにアイテムを入れたり取得したりするモックを使用することができます。後で、ADO .NETまたはEntity FrameworkまたはLINQ to SQLを介してデータベースに直接アクセスするインターフェイスを使用することがあります。おそらく、アプリケーションの存続期間の別の時点で、代わりにWCF Webサービスを使用する新しい実装が削除されます。

私の上記の例のポイントは、のコーリングコードが壊れないことです。 インターフェイスが満たされます。動作だけが変更されています。

+0

ありがとうございます。これが明らかにしたこと(そして他のコメント)は、私のインターフェイスの理解が完全に間違っているわけではないということです。ほとんどのコードベースのドキュメントがありましたが、その部分だけが実際のAPIです。コード自体から自動生成されたドキュメンテーション以上のものはありません(これはこの特定の会社の標準です)ので、私はそれを選ぶ必要があります。インターフェイスと一緒に私を助けてくれてありがとう!とても有難い。 –

1

Interfaceは、あなたが署名しようとしている契約で、瞬間にを実装しています。だから、この方法で何をすべきかは、このインターフェースで何をするかによって決まります。

public class MyFooImplementation:IFoo { 
    public Guid IFoo.AddBarToFoo(string fooID, string barPath) { 
     // do somethign and return GUID 
    } 
} 

Visual Studioは親切にあなたのために必要な署名を持つメソッドを生成しますが、あなたはそれを実装まだneeed原因、NotImplementedException()、当然、内部に押し込みます。そして、あなたがそれを忘れたり、却下したり、何かを書いたり、書き込んだりしないなら、あなたのクラス消費者は、そのメソッドの使用の瞬間にその例外を得るでしょう。

絶対に正しい動作です。

関連する問題