3

すべてがインターフェースを使用して実装されているように見えるため、これまでのAPIから一歩進んだように見える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を精査する必要がありますか?それとも私は完全に間違った道を進んでいますか?

4

2 に答える 2

4

それがインターフェースの問題です。それらは、誰かがそれらをどのように呼び出すかを定義するだけです。彼らは、その方法が実際に何をすべきか、あるいはそれがどのようにそれを行うべきかについて全く何も言いません。それは、インターフェースを実装する人が決めることです。

throw new NotImplementedException();VSは、コンパイラーを満足させるためだけに1行を追加することにより、メソッドを「実装」します。

これは、まったく異なることを行う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、またはLINQtoSQLを介してデータベースに直接アクセスするインターフェイスを使用する場合があります。おそらく、アプリケーションの存続期間の別の時点で、代わりにWCFWebサービスを使用する新しい実装がドロップされるでしょう。

上記の例のポイントは、呼び出し元のコードが壊れないことです。インターフェイスは満たされています-動作のみが変更されています。

于 2012-02-01T13:57:32.157 に答える
1

Interfaceあなたがそれを実行する瞬間に、あなたが署名しようとしている契約です。したがって、このメソッドで何をすべきかは、このインターフェースで何をするかによって異なります。

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

Visual Studio親切にあなたのために必要な署名を持つメソッドを生成しますが、当然、NotImplementedException()あなたがまだそれを実装する必要があるので、内部にプッシュします。そして、忘れたり、却下したりするが、その中に何も書かない場合、そのメソッドを使用する瞬間にクラスのコンシューマーはその例外を受け取ります。

絶対に正しい振る舞い。

于 2012-02-01T14:10:21.203 に答える