C# 制作一个C“方法”;实施;代表

C# 制作一个C“方法”;实施;代表,c#,.net,interface,methods,delegates,C#,.net,Interface,Methods,Delegates,有人知道C#中强制方法“实现”委托的方法吗 考虑这个大大简化的例子:(松散地基于我遇到的真实场景) ^-假设无法从^调用此逻辑 在本例中,我基本上希望“强制”方法符合ComputationMethod签名,就像接口强制类实现某些方法一样。相当于: private static int computeAverage(int termA, int termB, int termC, int termD) : ComputationMethod { //Implementati

有人知道C#中强制方法“实现”委托的方法吗

考虑这个大大简化的例子:(松散地基于我遇到的真实场景)

^-假设无法从^调用此逻辑

在本例中,我基本上希望“强制”方法符合ComputationMethod签名,就像接口强制类实现某些方法一样。相当于:

private static int computeAverage(int termA, int termB, int termC, int termD) : ComputationMethod
    {
        //Implementation omitted
    }
是的,显然我可以复制并粘贴方法签名,但从概念上讲,ComputationMethod的这些实现可以位于完全不同的类中,而不需要访问源代码。此外,如果有人随后出现并更改了一个应该符合某个委托的方法签名,则源代码将中断,但它可能会在一个完全不同的模块中悄无声息地中断


感谢您的帮助。

委托有一个由返回类型和参数(类型和顺序)组成的签名-如果您有一个与该签名匹配的方法,它将与委托匹配

您询问的方法是静态的,这没有什么区别

没有直接的方法可以确保任何特定的方法都符合委托签名-您可以使用符合该签名的方法创建接口,并确保其得到使用和实现。

C#不支持这一点

但是,只需将该方法放入委托中即可进行模拟:

static readonly ComputationMethod _ForceCompliance = ComputeAverage;
private static int ComputeAverage(int termA, int termB, int termC, int termD) { ... }
更改方法或委托签名将导致方法上方一行的编译器错误

(使用实例方法执行此操作需要构造函数调用)

为了提高效率,您可以在未使用的嵌套类和/或在
#if DEBUG
中执行此操作


无论哪种方式,请务必留下解释性注释。

如果不需要使用委托,可以使用以下模式

public interface IComputationMethod
{
    int ComputationMethod(int termA, int termB, int termC, int termD);
}

public class AverageComputer : IComputationMethod
{
    public override int ComputationMethod(int termA, int termB, int termC, int termD)
    {
    // omitted.
    }
}

public class StDevComputer : IComputationMethod
{
    public override int ComputationMethod(int termA, int termB, int termC, int termD)
    {
    // omitted.
    }
}
并将计算助手的签名更改为:

private int computationHelper(int termA, int termB, int termC, int termD, IComputationMethod computation)
{
    //Some common logic^
    int answer = computation.ComputationMethod(termA, termB, termC, termD);
    //Some more common logic^
    return answer;
}
private int computationHelper(int termA, int termB, int termC, int termD, IComputationMethod computation)
{
    //Some common logic^
    int answer = computation.ComputationMethod(termA, termB, termC, termD);
    //Some more common logic^
    return answer;
}