我试图以一种我从未在各种书中描述的方式使用代表。
我的问题是:
是否可以通过这种方式使用代理?和
如果是这样,我应该如何更改代码才能使用代理?
具体来说,我想要一个函数从两个可能的函数中选择另一个函数。
class Profile
{
private List<verticalCurve> allVCs;
// create allVCs in the constructor
private double nonTrivialFunctionToFindTheRightVCin_allVCs
(double lengthAlong, getSwitchForProfile aDel)
{ // about thirty lines of code which I want to reuse }
public double getElevation(double distanceAlongPfl)
{
// compiler error on the following line:
getSwitchForProfile myDelEL =
new verticalCurve.getSwitchForProfile(verticalCurve.getElevation);
return nonTrivialFunctionToFindTheRightVCin_allVCs
(distanceAlongPfl, myDelEL);
}
public double getSlope(double distanceAlongPfl)
{
// compiler error on the following line:
getSwitchForProfile myDelSL =
new verticalCurve.getSwitchForProfile(verticalCurve.getSlope);
return nonTrivialFunctionToFindTheRightVCin_allVCs
(distanceAlongPfl, myDelSL);
}
} // end class Profile
class verticalCurve
{
private double elevation;
private double slope;
static internal delegate double getSwitchForProfiles(double distanceAlongPfl);
public double getElevation(double distanceAlong)
{ computeElevation then return elevation; }
public slope getSlope(double distanceAlong)
{ compute slope then return slope;}
} // end class verticalCurve
编译器错误状态
非静态字段,方法或属性'Profile.verticalCurve.getElevation(distanceAlong)'
需要对象引用看来我的问题是,当我向委托分配一个方法时,我还不知道它将被调用哪个verticalCurve实例。但我不能使verticalCurve.getElevation静态,因为它必须知道它所在的verticalCurve。
很抱歉对这些问题进行了长时间的设置。我确实试图简化它,但在这一点上似乎不可简化。
提前感谢您的帮助。
答案 0 :(得分:5)
听起来你想要创建一个委托,它将对象作为参数调用它:
delegate double DistanceFunction(VerticalCurve curve, double distance);
void SomeFunction(DistanceFunction func) {
double result = func(someCurve, 42);
}
SomeFunction((c, dist) => c.GetSlope(dist));