0

私は、さまざまな本で説明されているのを見たことがない方法でデリゲートを使用しようとしています。

私の質問は次のとおりです。

このようにデリゲートを使用することは可能ですか?

もしそうなら、デリゲートを利用するためにコードをどのように変更すればよいですか?

具体的には、1 つの関数が 2 つの可能な関数の選択から別の関数を呼び出すようにします。

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 にあるかを知る必要があるためです。

質問の設定が長くなって申し訳ありません。私はそれを単純化しようとしましたが、この点を超えて還元できないようです.

よろしくお願いします。

  • ポール・シュラム
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 に答える