方法作为构造函数的参数?

时间:2014-03-06 20:23:22

标签: c# constructor

我正在写一个K-Nearest Neighbors分类器类。我想允许客户端指定要使用的距离函数。

我的KNNClassifier对象的构造函数可以将方法作为参数吗?在Python中,我这样做如下:

class KNNClassifier:

    def __init__(self, examples, membership, n_classes, distance_func):

        self.examples      = examples
        self.membership    = membership
        self.n_classes     = n_classes
        self.distance_func = distance_func

        self.m = len(self.membership)
        self.n = len(self.examples[0])`

可以用C#完成吗?我是C#的新手,一个基本的例子将不胜感激。

2 个答案:

答案 0 :(得分:4)

您使用delegates。以下是使用generics的简单示例:

public class MyClass<T>
{
    private Func<T, T, int> _distanceFunc

    public MyClass(Func<T, T, int> distanceFunc)
    {
        this._distanceFunc = distanceFunc;
    }
}

这声明了一个generic classMyClass,它接受​​一个泛型类型参数T,并且有一个带有一个参数的构造函数。该参数本身是一个函数,它接受T类型的两个参数并返回int。在MyClass内,_distanceFunc指向的委托可以用括号调用,就像任何其他函数一样:

T instanceA = ...
T instanceB = ...
int result = this._distanceFunc(instanceA, instanceB);

您甚至可以将其与lambda expressions结合使用,如下所示:

var foo = new MyClass<string>((a, b) => Math.Abs(a.Length - b.Length));

答案 1 :(得分:1)

是的,您可以使用FuncActiondelegates来执行此操作:

行动:http://www.dotnetperls.com/action

Func:http://www.dotnetperls.com/func

委托:http://msdn.microsoft.com/en-us/library/aa288459(v=vs.71).aspx