【发布时间】:2016-07-28 18:00:24
【问题描述】:
我有矩阵类的层次结构。我不想更改我的类,所以我决定使用访问者模式来包含诸如加法、乘法等矩阵运算。我的层次结构如下所示:
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 是否会重载运算符“+”。我决定使用委托函数,例如具体访问者的参数。现在我的具体访问者类看起来像这样:
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]);
}
}
我真的很讨厌我的方式,因为如果我想添加或相乘方阵和对角矩阵,我必须创建一个访问者实例并再次定义操作。有没有更优雅的方式?谢谢。
【问题讨论】:
标签: c# visitor-pattern