我有矩阵类的层次结构。余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]);
}
}
我真的很讨厌我的方式,因为如果我要相加或相乘方阵和对角矩阵我要创建访问者的实例,并重新定义操作。有没有更优雅的方式?谢谢。