私はマトリックスクラスの階層を持っています。私の階層はそのように見えるなど、私は私のクラスを変更したいdid'tので、私はさらに、乗算のような行列演算を含めるようにビジターパターンを使用することにしました:ジェネリッククラスの階層でビジターパターンを使用する最も良い方法は何ですか?
public abstract class Matrix<T> {
public abstract T GetValue(int i, int j);
public abstract void SetValue(int i, int j, T value);
public abstract Matrix<T> Accept(MatrixVisitor<T> visitor, Matrix<T> matrix);
}
public class SquareMatrix<T> : Matrix<T> {}
public class DiagonalMatrix<T> : Matrix<T> {}
public class SymmetricMatrix<T> : Matrix<T> {}
これらのクラスのすべてのメソッドを受け入れる実装します。
public override Matrix<T> Accept(MatrixVisitor<T> visitor, Matrix<T> matrix)
{
return visitor.Operation(this, matrix);
}
しかし、私は、私はTを入力します知らない型Tを持つ2つの要素を追加してstuckedたが「+」演算子をオーバーロードしています。私は具体的な訪問者のパラメータなどの代理人Funcを使用することに決めました。そして今、私の具体的な訪問者のクラスは次のようになります。私は正方行列と対角行列を追加したり、乗算したい場合、私は訪問者のインスタンスを作成し、操作を再定義する必要があるため
public class SumOfSquareMatricesVisitor<T> : MatrixVisitor<T>
{
public SumOfSquareMatricesVisitor(Func<T, T, T> sumOfTwoTypesOperation)
{
this.sumOfTwoTypesOperation = sumOfTwoTypesOperation;
}
public override Matrix<T> Operation(Matrix<T> A, Matrix<T> B)
{
// example
// into a loop
// result = sumOfTwoTypesOperation(A[i,j], B[i,j]);
}
}
私は本当に、私の方法を憎みます。よりエレガントな方法がありますか?ありがとう。