接口中的GetMethod作为类c#的字段?

时间:2016-11-08 12:12:14

标签: c# interface

这是计算器程序。检查我有:

public Interface IFunction{
    string Name {get; }
    double Eval();
}

并且

public class subtract:IFunction{
    private double x,y;
    public double Eval(){
     return x - y;
     }
    public string Name{
        get { return "subtract";}
    }
}

public class add:IFunction{
    private double x, y;
    public double Eval(){
     return x + y;
     }
    public string Name{
        get { return "add";}
    }
}

我必须编写具有字符串字段操作的类。对于该字符串字段的名称,我必须使用Name{ get; }中的IFunction"add""subtract".如果是"减去",请执行减法运算,从Eval()类调用subtract方法等;如何在类Calculator中对此方法进行多态调用?必须Calculator类实现接口吗?

 public class Calculator{
    private double leftOperand, rightOperand;
    private string operation;
    public double Calculate(){
    /*here must call Eval() from subtract or add, depending    on `operation` */
    }
}

1 个答案:

答案 0 :(得分:0)

您可以Calculator包含IFunction

的列表
private IList<IFunction> functions;

然后在调用Calculate时迭代该列表:

IFunction function = functions.FirstOrDefault(f => f.Name == operation);

然后,如果它为null,则抛出异常或返回默认值。

正如@Rob在评论中所提到的,IFunction需要一种方法来分配xy值,这可以通过属性来实现:

public double X { get; set; }

或修改接口,以便Eval方法接受它们作为参数:

double Eval(double x, double y);

因此,我将在Calculate

中执行以下操作
IFunction function = functions.FirstOrDefault(f => f.Name == operation);
if (function == null)
{
    //Or return some default value
    throw new ArgumentOutOfRangeException("operation", "Unable to find the operation in the list of available ones");
}

return Eval(leftOperand, rightOperand);