2

あまり実用的ではないかもしれませんが、それでも興味深いものです。

行列の乗算に関するいくつかの抽象的な質問があるため、int の行列をすぐに実装してから、自分の仮定をテストしました。

ここで、10 進数または倍精度で使用したい場合は、単に int マトリックスが適していないことに気付きました。もちろん、すべてを double にキャストすることもできますが、それは便利な方法ではありません。

足し算や掛け算ができるオブジェクトがたくさんあるという仮定を続けてください。私のマトリックスでそれらを使わないのはなぜですか?

したがって、それが Matrix クラスになると考えた直後に、ジェネリック T を使用できないことに直面しました。加算および乗算できるインターフェイスをサポートする必要があります。

そして問題は、自分のクラスで演算子をオーバーライドできたのですが、演算子をサポートするインターフェースを導入できなかったことです。また、組み込み型に演算子がありますが、それらに対するインターフェイスはまだありません。

ワーカークラスの本体を複製したくない場合、そのような場合はどうしますか? ラッパーと暗黙のキャストはあまり役に立ちませんでした。美しいソリューションに興味があります。

ありがとう。

4

2 に答える 2

5

このためには、一般的な数学が必要です。幸いなことに、私はこれを行いました。使用法は、この「複雑な」(つまり x+iy)のに似ています。Operator クラスはMiscUtilの一部になりました。

于 2008-10-03T11:12:29.307 に答える
2

まあ、それを行うための技術的負担の少ない方法があります。「int」または「double」の新しいインターフェイスを追加することはできません。ただし、ジェネリック型の値を乗算およ​​び加算できるオブジェクトのインターフェイスを宣言することはできます。そして、必要なすべてのタイプのインターフェースを実装できます。

public interface ICalculator<T>
{

   T Add(T x, T y);
   T Multiply(T x, T y);

}

public class MatrixMultiplier<T>
{

  public MatrixMultiplier(ICalculator<T> calculator) { ... }

}

public class IntCalculator : ICalculator<int>
{

  public int Add(int x, int y)
  {
    return x + y;
  }

  public int Multiply(int x, int y)
  {
    return x * y;
  }

}
于 2008-10-03T19:33:38.427 に答える