有谁知道在 C# 中强制方法“实现”委托(delegate)的方法吗?
考虑这个大大简化的示例:(大致基于我遇到的真实场景)
private delegate int ComputationMethod(int termA, int termB, int termC, int termD);
private int computationHelper(int termA, int termB, int termC, int termD, ComputationMethod computationMethod)
{
//Some common logic^
int answer = computationMethod(termA, termB, termC, termD);
//Some more common logic^
return answer;
}
public int ComputeAverage(int termA, int termB, int termC, int termD)
{
//^^
return computationHelper(termA, termB, termC, termD, computeAverage);
}
public int ComputeStandardDeviation(int termA, int termB, int termC, int termD)
{
//^^
return computationHelper(termA, termB, termC, termD, computeStandardDeviation);
}
//Is there some way to force this method's signature to match ComputationMethod?
private static int computeAverage(int termA, int termB, int termC, int termD)
{
//Implementation omitted
}
//Is there some way to force this method's signature to match ComputationMethod?
private static int computeStandardDeviation(int termA, int termB, int termC, int termD)
{
//Implementation omitted
}
^ - 假设此逻辑不能从 ^^ 调用。
在这个例子中,我基本上想“强制”方法遵循 ComputationMethod 签名,就像接口(interface)强制类实现某些方法一样。相当于:
private static int computeAverage(int termA, int termB, int termC, int termD) : ComputationMethod
{
//Implementation omitted
}
是的,显然我可以只复制并粘贴方法签名,但从概念上讲,ComputationMethod 的这些实现可以位于完全不同的类中,而无需访问源代码。此外,如果有人随后出现并更改了本应符合某个委托(delegate)的方法签名,源代码将会中断,但它可能会在完全不同的模块中悄无声息地中断。
感谢您的帮助。
最佳答案
C# 不支持这个。
但是,您可以通过简单地将方法放入委托(delegate)中来模拟它:
static readonly ComputationMethod _ForceCompliance = ComputeAverage;
private static int ComputeAverage(int termA, int termB, int termC, int termD) { ... }
更改方法或委托(delegate)签名会导致方法上方一行的编译器错误。
(使用实例方法执行此操作需要调用构造函数)
为了提高效率,您可以在未使用的嵌套类和/或 #if DEBUG
中执行此操作。
无论哪种方式,请务必留下解释性评论。
关于c# - 使 C# 方法 "implement"成为委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9741435/