c# - 使 C# 方法 "implement"成为委托(delegate)

标签 c# .net interface methods delegates

有谁知道在 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/

相关文章:

c# - 根据for循环位置制作字典的键

c# - 当您调用 Dispatcher.Invoke(Action) 时分配给操作的调度程序优先级是多少?

c# - 以编程方式访问 WPF 控件

c# - 每个键包含多个值的列表

ios - 告诉 Interface Builder 有关自定义对象的信息。 Xcode 4.0.2

vb.net - 如何在 VB.NET 中将接口(interface)属性设置为只读?

pointers - 接口(interface)不能调用self方法

c# - 在函数参数中捕获异常

c# - 在两个图像之间循环以模拟 C# WPF 中的动画

c# - 使用对象的接口(interface)将对象列表转换为 IList