1

インターフェイスから派生したクラスがあります。ここで、クラスはインターフェイスのすべてのメソッドを実装する必要があり、さらに 2 つのメソッドを追加で定義します。今私の質問は、これを行う利点/ユースケースは何ですか:

IMyInterface varInt= new ConcreteImp();

以上、

ConcreteImp varInt= new ConcreteImp(); 

このパターンがコード ブロックのあらゆる場所で使用されていることがわかりますが、なぜこれが使用されるのかわかりません。

4

5 に答える 5

2

インターフェイスを使用する利点は、ソフトウェア コンポーネントの具体的な実装に対するパーツの依存関係が減少することです。投稿した1行では、特典が表示されません。そのインターフェースの消費者は利益を得ることができます。

編集:抽象化に関するこの記事を読むことをお勧めします。

たとえば、 so のようなインターフェースを受け入れるメソッドがあるとしますRent(IMovie)。別の人は、メソッドを呼び出すときに渡す型Rent()の詳細を知らなくても、メソッドの実装を作成できます。その後、請求方法が異なる可能性のある複数の異なる実装IMovieを作成できますが、方法はそれを処理する必要はありません。IMovieRent()

void Rent(IMovie movie)
{
    var price = movie.Price();
    movie.MarkReserved();
}

public interface IMovie { }

public class Oldie : IMovie
{
    private decimal _oldieRate = 0.8;

    public decimal Price()
    {
        return MainData.RentPrice * _oldieRate;
    }
    public decimal MarkReserved()
    {
        _oldiesDb.MarkReserved(this, true);
    }
}


public class Blockbuster : IMovie
{
    private decimal _blockbusterRate = 1.2;

    public decimal Price()
    {
        return MainData.RentPrice * _blockbusterRate ;
    }
    public decimal MarkReserved()
    {
        _regularDb.MarkReserved(this, true);
    }
}

これはインターフェイスが有用である理由の例ですが、コード設計のあまり良い例ではありません。

経験則として、メソッドが機能するために必要な最小限の入力しか必要とせず、その出力が、他のユーザーが呼び出したときに使用できる情報をできるだけ多く提供するように、メソッドを作成する必要があります。たとえば、次の署名を見てください。

public List<Entity> Filter(IEnumerable<Entity> baseCollection){ ... }

このメソッドはIEnumerable<Entity>、 などのさまざまなコレクション タイプや、一部のツールが返すカスタム タイプを取得できるようにList<Entity>のみEntity[]要求します。しかしList<Entity>、すぐに呼び出し元を列挙可能な要素だけに制限しないように戻ります。たとえば、戻り値に対してすぐに Linq を使用できます。

単体テストのように、モック オブジェクトを作成し、残りのコードとの対話中にどのように動作するかを伝えることができるなど、さらに多くの利点があります。ただし、現在は仮想メソッドを持つクラスでこれを行うことができます。

于 2012-11-29T08:45:50.487 に答える
1

IMyInterfaceコードの別の場所で、別の実装をvarInt変数に割り当てられるようにしたいとします。次に、その変数を type で宣言する必要がありますIMyInterface

varIntあるいは、 で定義されたインターフェイスを使用するだけであることをコード リーダーに明確にしたい場合IMyInterfaceは、型宣言でそれを明確にします。

于 2012-11-29T08:41:44.777 に答える
1

派生クラスで機能を強制する必要がある場合は、インターフェイスを使用します。

スーパークラスからサブクラスにデータを渡す必要がある場合は、具象クラスを使用します。インターフェイスとサブクラスの背後にある基本的な oop のアイデアです。

于 2012-11-29T08:43:14.750 に答える
1

newあなたの具体的な例では、具体的な型を使用して作成しているので、それほど重要ではないと思います。依存性注入を使い始めると、より便利になります。

より便利なシナリオは次のようになります。

public SomeResultType DoSomething(ISomeType obj)
{
    //to something with obj
    // return someResultType
}

上記は、実装されている限り、任意の型を使用して呼び出すことができますISomeType。しかし、newキーワードを使用した例では、代わりにvar. その型を継承するため、実装する型として扱うことができます。

于 2012-11-29T08:46:42.387 に答える
1

IMyInterface に「Draw」メソッドがあると仮定すると、すべての派生クラスが「Draw」メソッドを実装する必要があります。メソッド「Render(IMyInterface shape)」を持つクラス「Engine」があれば、形状が何であれ「Draw」メソッドを呼び出すだけで済みます。そしてすべての形 彼が望むように自分自身を描きます。デザインパターンを見て、インターフェースの魔法を見ることができます ;)

于 2012-11-29T08:47:12.733 に答える