3

私はほとんどのものにインターフェースを使用しています。IPointインターフェイスを実装するオブジェクトに追加を実行できるオーバーロード演算子を作成する方法が見つかりません+

コード


interface IPoint
{
    double X { get; set; }
    double Y { get; set; }
}


class Point : IPoint
{
   double X { get; set; }
   double Y { get; set; }

   //How and where do I create this operator/extension  ???
   public static IPoint operator + (IPoint a,IPoint b)
   {
     return Add(a,b);
   }

   public static IPoint Add(IPoint a,IPoint b)
   {
      return new Point { X = a.X + b.X, Y = a.Y + b.Y };
   } 
}

   //Dumb use case :
public class Test
{
   IPoint _currentLocation;

   public Test(IPoint initialLocation)
   {
     _currentLocation = intialLocation
   }
   public MoveOf(IPoint movement)
   {

      _currentLocation = _currentLocation + intialLocation;
     //Much cleaner/user-friendly than _currentLocation = Point.Add(_currentLocation,intialLocation); 
   }
}

4

2 に答える 2

3

あなたはそうしない。2つのIPointインスタンスaとbがあり、両方とも異なるクラス(IPointを実装している)があるとします。ここで「a+b」と呼びます。どのoperator+が呼び出されますか?どの具体的なタイプが返されますか?

編集:申し訳ありませんが、コメントを明確にするために、「現状ではC#ではありません」。あなたがこれを行うことができるべきかどうかについて、私はいくつかの哲学的な議論をしています。あなたがいくつかの重大な混乱を引き起こす可能性があると私は思うからです。

于 2009-05-27T16:06:08.917 に答える
0

私はあなたが求めていることをすることができるとは思わない. 問題は、使用例であっても、そのメソッドにアクセスするにはパラメーターを a.Addにキャストする必要があることです。これは、C# の制限だと思います。間違っている場合は、それについて知っていただければ幸いです。movementPoint Type

私がお勧めするのは、常にaを取得することがわかっている場合は、常にメソッド内にキャストするのが安全ですが、その場合はパラメーターとして受け入れる必要があるということです。 Point TypeMoveOfPointPoint

他に言えることは、Point Type最初に を作成してそれを に渡す場合、キャストする前にinsideMoveOfのタイプを確認できるということです。もちろん、ここでの問題は、メソッドを継承して使用するすべての型に対して最終的にこれを行う必要があることです。movementMoveOfIPointMoveOf

于 2009-05-27T16:22:47.777 に答える