【发布时间】:2015-04-21 20:43:14
【问题描述】:
有什么方法可以使用委托“重载”函数吗?我想有一个系统,我可以在构造函数中传递一个匿名函数并将其保存在成员变量中。数据类型并不是真正的问题,但传递的函数可以有一个或两个参数。我尝试在委托定义中使用 (params double[] vals),但这会使传递的匿名函数变得复杂,并且允许的参数超出了应允许的范围。
所以我创建了两个空方法来保存这两种类型。举个例子:
public class OpWrapper
{
public int operands; //the number of operands this operator needs.
public int precedence; //the precedence this operator gets when calculating.
public bool rightAssoc; //whether or not this operator is right associative (true) or left associative (false).
public delegate double evalDelegate(double a, double b);
public delegate double calcDelegate(double a);
public evalDelegate eval; //method used for two value inputs. Assigned in constructor.
public calcDelegate calc; //method used for single value input. Assigned in constructor.
//constructor initializes all variables.
public OpWrapper(int o, int p, evalDelegate f, bool a = false)
{
operands = o;
precedence = p;
rightAssoc = a;
eval = new evalDelegate(f);
}
//overloaded constructor assigns the proper method.
public OpWrapper(int o, int p, calcDelegate f, bool a = false)
{
operands = o;
precedence = p;
rightAssoc = a;
calc = new calcDelegate(f);
}
public double evaluate(params double[] values)
{
//do stuff
if (operands == 1)
{
return calc(values[0]);
}
else
{
return eval(values[0], values[1]);
}
//more stuff
}
}
最终,我想做的更像是这样:
public class OpWrapper
{
public int operands; //the number of operands this operator needs.
public int precedence; //the precedence this operator gets when calculating.
public bool rightAssoc; //whether or not this operator is right associative (true) or left associative (false).
public delegate double evalDelegate(double a, double b);
public delegate double calcDelegate(double a);
public ???????? calc; //method that does the passed function.
//constructor initializes all variables.
public OpWrapper(int o, int p, evalDelegate f, bool a = false)
{
operands = o;
precedence = p;
rightAssoc = a;
eval = new evalDelegate(f);
}
//overloaded constructor assigns the proper method.
public OpWrapper(int o, int p, calcDelegate f, bool a = false)
{
operands = o;
precedence = p;
rightAssoc = a;
calc = new calcDelegate(f);
}
public double evaluate(params double[] values)
{
//do stuff
if (operands == 1)
{
return calc(values[0]);
}
else
{
return calc(values[0], values[1]);
}
//more stuff
}
}
我对 C# 还不是很熟悉,但肯定有一种方法可以做这样的事情,而不必定义一个委托的实例,或者另一个不使用的委托实例。
【问题讨论】:
-
如果你不需要返回值,你应该使用 Action,如果你需要,你应该使用 Func。这些替换了经典委托,因此无需创建委托签名。
-
看起来您正在尝试做一些可以使用表达式更容易实现的事情。但它并不完全清楚那个“东西”是什么。
-
你知道代表是什么吗?像这样想..
A Delegate is like a placeholder for Methods在 Delegates 上进行谷歌搜索,因为您对 C# 不是很熟悉,正如您所说.. 您熟悉GOOGLE现在来吧 -
@Jacob:注意到了。我开始使用 Func,但是当我尝试使用 params double[] 作为参数并发现 Func 和 params 彼此不喜欢时,它们被切换了。
-
@Alex:这个例子只是我为了学习 c# 的一些细微差别而正在做的事情。它基本上只是一个表达式的包装器,它将它们放在一起并从反向波兰表示法进行评估。
标签: c# .net delegates overloading