我有矩陣類的層次結構。餘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> {}
所有這些類的實現Accept方法:
public override Matrix<T> Accept(MatrixVisitor<T> visitor, Matrix<T> matrix)
{
return visitor.Operation(this, matrix);
}
但是我與另外具有類型T.我不知道將類型T的兩個元素的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]);
}
}
我真的很討厭我的方式,因爲如果我要相加或相乘方陣和對角矩陣我要創建訪問者的實例,並重新定義操作。有沒有更優雅的方式?謝謝。