2

私はいくつかのメソッドを持つインターフェイスを持っています

interface IFunction
{
    public double y(double x);

    public double yDerivative(double x);
}

私はそれを実装している静的クラスを持っています。

static class TemplateFunction:IFunction
{
    public static double y(double x)
    {
        return 0;
    }

    public static double yDerivative(double x)
    {
        return 0;
    }
}

このクラスをパラメーターとして別の関数に渡したいです。

 AnotherClass.callSomeFunction(TemplateFunction);

そして、リクエストをキャッチする他のクラス

class AnotherClass
{
    IFunction function;
    public void callSomeFunction(IFunction function)
    {
        this.fuction = function;
    }
}

うーん、うまくいきません... Type 式を使用しようとしましたが、その継ぎ目がインターフェイスを使用するという考えを壊しています。コードを修正する方法を知っている人はいますか?

4

4 に答える 4

5

静的クラスはインターフェイスを実装できませんが、クラスを非静的にし、ジェネリック メソッドを作成することで、これを簡単に克服できます。

class AnotherClass
{
    IFunction function;

    public void callSomeFunction<T>()
        where T: IFunction, new()
    {
        this.fuction = new T();
    }
}

これは、必要な構文に非常に近いものです。

AnotherClass.callSomeFunction<TemplateFunction>();

しかし、実際には、この方法は複雑すぎて誰かを混乱させる可能性が高いと思います。より単純なServyのアプローチに従う必要があります。

AnotherClass.callSomeFunction(TemplateFunction.Instance);
于 2012-12-18T19:16:28.543 に答える
2

インターフェイスを実装する静的クラスを取得する概念的な方法は、シングルトンに状態が含まれていなくても、シングルトンを使用することです。

public sealed class TemplateFunction : IFunction
{
    private TemplateFunction() { }
    private static TemplateFunction instance = new TemplateFunction();

    public static TemplateFunction Instance { get { return instance; } }

    public double y(double x)
    {
        return 0;
    }

    public double yDerivative(double x)
    {
        return 0;
    }
}

もう 1 つのオプションは、インターフェイスを使用せず、代わりにメソッドに 1 つ以上のデリゲートを受け入れるようにすることです。メソッドが 1 つだけ必要な場合は問題ありません。2 つ以上ある場合は、通常、問題になります。

public class AnotherClass
{
    public static void callSomeFunction(Func<double, double> y
        , Func<double, double> yDerivitive)
    {
        //store delegates for later use
    }
}

AnotherClass.callSomeFunction(TemplateFunction.y, TemplateFunction.yDerivative);
于 2012-12-18T19:16:47.967 に答える
0

ジェネリック メソッドを使用して、呼び出している型をキャッチするのはどうですか。

このような:

public void callSomeFunction<T>()
{
    //the type is T
    //you can create an instance of T with System.Activator.CreateInstance(T) and T's methods
    //alternatively if the classes are static you can call the methods with reflection knowing only their name.
}

とにかく、これを行う理由が、同じメソッドを実装する複数のクラスが必要であり、型に基づいてそれらのメソッドの特定の実装を呼び出すメソッドを作成するためである場合、他のソリューションが含まれている可能性がありますオーバーロードのような順序。

または、実際にこれがやりたいことである場合は、インスタンスを作成できるようにアクティベーターがタイプにアクセスできる必要があるため、インターフェイスを渡すと、私が提示したアプローチを使用できないことに注意してください。 .

于 2012-12-18T19:15:58.207 に答える
0

Allon が言ったように、TemplateFunction を none static に変更してから、これを行うことができます。

var anotherClass = new AnotherClass();
var templateFunction = new TemplateFunction();

anotherClass.callSomeFunction(templateFunction);
于 2012-12-18T19:24:25.367 に答える