Ich habe die Hierarchie der Matrix-Klassen. Ich möchte did't meine Klassen ändern, also entschied ich mich Besuchermuster zu verwenden, wie Matrix-Operationen umfassen wie Addition, Multiplikation usw. Meine Hierarchie wie das aussieht:Wie kann das Besuchermuster in einer Hierarchie generischer Klassen am besten verwendet werden?
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> {}
Alle diese Klassen implementieren Methode Accept:
public override Matrix<T> Accept(MatrixVisitor<T> visitor, Matrix<T> matrix)
{
return visitor.Operation(this, matrix);
}
Aber ich wurde durch Zugabe von zwei Elementen stucked die Art T. habe ich nicht weiß, T haben Betreiber geben wird ‚+‘ überlastet. Ich habe mich dafür entschieden, Delegat Func wie Parameter des konkreten Besuchers zu verwenden. Und jetzt sieht meine konkrete Besucher Klasse wie folgt:
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]);
}
}
ich mich wirklich hassen, denn wenn ich hinzufügen mag oder multiplizieren quadratische Matrix und Diagonalmatrix Ich habe eine Instanz Besucher zu schaffen und definieren wieder Betrieb. Gibt es einen eleganteren Weg? Vielen Dank.