gpt4 book ai didi

c# - Functors() 为类重载

转载 作者:行者123 更新时间:2023-11-30 16:31:42 26 4
gpt4 key购买 nike

我不认为这是可能的,如果它是或为什么不是这样,我很好奇:

class A
{

}

我想将 A 的实例视为函数,例如

A a = new A();

a();
or
a(3);
etc...

这是为了在特殊情况下将类视为函数,这样做很有用。例如,我本质上是在包装一个 Func 对象,但我希望将此类的实例视为 Func 对象本身。这样我就不必在类中调用“虚拟”函数。


    public class Condition
{
protected Func<bool> Eval { get; set; }
protected bool Or = false;

protected Condition() { }
public Condition(Func<bool> f, bool Or = false) { Eval = f; this.Or = Or; }
protected Func<bool> GetEval(Condition c) { return c.Eval; }
protected bool GetOr(Condition c) { return c.Or; }

}

public class ConditionBlock : Condition
{
List<Condition> Conditions;

public ConditionBlock() { Eval = _Eval; }

public ConditionBlock(List<Condition> Conditions) : this() { this.Conditions = Conditions; }
public ConditionBlock(Condition[] Conditions) : this() { this.Conditions = new List<Condition>(Conditions); }
public void Add(Condition c) { if (Conditions == null) Conditions = new List<Condition>(); Conditions.Add(c); }

private bool _Eval()
{
if (Conditions == null || Conditions.Count == 0) return true;

bool ans = !GetOr(Conditions[0]);
for (int i = 0; i < Conditions.Count; i++)
ans = GetOr(Conditions[i]) ? ans | GetEval(Conditions[i])() : ans & GetEval(Conditions[i])();

return ans;
}

public bool _()
{
return Eval();
}
}

为了启动计算,我调用了成员 (),例如 cblock.()。如果我可以将它称为 cblock(),它看起来会好得多。实际上,ConditionBlock 是一个复合函数。能够这样对待它会很好。使用 _() 非常难看,因为将它重命名为任何其他名称,例如 cblock.fire()、cblock.eval() 等...

最佳答案

您不能在 C# 中重载 () 运算符,但这就是委托(delegate)的作用;他们按照您的描述进行操作,例如:

class AccumulateToString
{
private int sum;
public string ToString(int val)
{ this.sum += val; return this.sum.ToString(); }
}
var fn = new Converter<int, string>(new AccumulateToString().ToString);
Console.WriteLine(fn(2)); // <-- called like a function but is an object w/ state

关于c# - Functors() 为类重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4731979/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com