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;
    }
}

另一种选择是不使用接口,而是让您的方法接受一个或多个委托。如果您只需要一种方法,那很好,如果您有两种方法,有时可以,有时则不行。如果你有两个以上,这通常是一个问题。

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.
}

无论如何,如果您想要这样做的原因是因为您想要拥有多个实现相同方法的类,并且您想要编写一个方法来根据类型调用这些方法的某个实现,那么其他解决方案可能会在顺序,如重载。

或者,如果这确实是您想要做的,那么请记住,传递接口将不允许您使用我向您介绍的方法,因为 Activator 需要访问 Type 以便它可以创建实例.

于 2012-12-18T19:15:58.207 回答
0

您可以按照 Allon 所说的将 TemplateFunction 更改为非静态,然后执行以下操作:

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

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