0

我正在尝试以我在我的各种书籍中从未见过的方式使用委托。

我的问题是:

是否可以以这种方式使用代表?

如果是这样,我应该如何更改代码以使用委托?

具体来说,我希望一个函数从两个可能的函数中调用另一个函数。

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.getElevation设为静态,因为它必须知道它在哪个verticalCurve上。

很抱歉对问题进行了长时间的设置。我确实尝试过简化它,但超出这一点似乎无法简化。

在此先感谢您的帮助。

  • 保罗·施鲁姆
4

1 回答 1

5

听起来您想创建一个委托,该委托将对象作为参数调用它:

delegate double DistanceFunction(VerticalCurve curve, double distance);

void SomeFunction(DistanceFunction func) {
    double result = func(someCurve, 42);
}

SomeFunction((c, dist) => c.GetSlope(dist));
于 2012-08-14T23:37:15.690 回答