8

私は C# コードを 10 年間書いていますが、インターフェイスをいつ使用するか、Func や Action を使用するかを正確に知ることができません。インターフェイスのメソッドが呼び出される多くの場所では、Func または Action も同様に機能するように思えます。だから、私の質問はこれだと思います。単一のメソッド、またはいくつかのメソッドを持つインターフェイスがある場合、代わりに Func または Action を使用することに不利な点はありますか? Func または Action を使用すると、私にはよりきれいに思えます。

どうもありがとう。

4

4 に答える 4

7

ActionまたはFuncを1つのメソッドを含むインターフェースと比較できると思いますが、任意のメソッドを提供できる ActionFunc、パラメーター/戻り値の要件を満たすという違いがあります。インターフェースを使用する場合、提供されたオブジェクトはそのインターフェースを実装する必要があります。

Actionおそらく、Func「匿名の単一メソッドインターフェイス」を呼び出すことができます。

ただし、設計の観点から見ると、クラスモデルは、ブロック間に線がないブロックの描画になります。

于 2012-10-31T14:18:34.157 に答える
4

実装が非常に短い(1行または2行)と予想される場合、特に実装にローカル変数(クロージャ)が必要であると予想される場合は、デリゲートとラムダ式を使用する必要があります。

于 2012-10-31T14:08:22.770 に答える
4

私は認めなければなりません、私はこの質問に少し混乱していました。@deepeeのように、あるアプローチを他のアプローチよりも使用すると思う理由を示すために、ここでコード例が適切であったことに同意します。

私の混乱の理由は、彼らが異なる目的を果たしているので、私がこの質問をすることを考えなかったであろうということです。インターフェイスは主にポリモーフィズムに使用されます。さまざまな実装をすべて同じように扱うことができるようにします。

Jon Skeetは、FuncとActionを使用した良い例を示しています。

インターフェイスを使用すると、これを行うことができます。

IAnimal animal = AnimalFactory.GetAnimal();
animal.Run();

上記のコードを使用すると、それがどのような動物であるかを知らないか、気にしません。あなたはそれが実行できることを知っていて、それを実行したいと思っています。さらに重要なことに、発信者は動物がどのように走るかを知りません。これが、アクションとインターフェース/ポリモーフィズムの違いです。何かをするための論理は具体的なクラスにあります。

アクションを使用すると、各具体的なインスタンスに何かを実行させる代わりに、実際のロジックが呼び出し元に認識されている場合に、各インスタンスに対して同じことを実行できます。

animals.ForEach(x => x.Run());

または:

animals.ForEach(x => /* do something completely different here */);

上記のコード行は、メソッドを呼び出すだけでロジックを実際のインスタンスに委任するのではなく、呼び出し元だけが何をすべきかを決定するアクションです。

彼らはさまざまな問題を解決するので、人々が特定の状況でそれらが交換可能であるとどのように考えるかを知りたいです。

于 2012-10-31T14:44:09.450 に答える
1

作業しているオブジェクトの種類をあまり気にしない場合は、インターフェイスを使用します...

教科書の例を見てみましょう

パブリック クラスの動物。

public class Dog : Animal, IRunningAnimal { }
public class Cheetah : Animal, IRunningAnimal { }
public class Fish : Animal, ISwimmingAnimal { }
public class Gator : Animal, ISwimmingAnimal, IRunningAnimal { }

public interface IRunningAnimal 
{
    public void Run();
}

public interface ISwimmingAnimal
{
    public void Swim();
}

public abstract class Animal
{
    /// ...
    public abstract void Move();
}

次に、コードのどこか...

RunningAnimal runner = getAnimal();
//make him run
runner.Run();

走っている動物はそれぞれ異なる方法で走るかもしれませんが、すべて走ることができます。

またはそれ以上

if(getAnimal() instanceof RunningAnimal) getAnimal().Run();
else getAnimal().Move();
于 2012-10-31T14:10:04.090 に答える