using System; namespace Psychlops { public abstract class Matrix { public abstract double this[int row, int col] { get; set; } /* public static Matrix operator +(Matrix m, double d) { return new Internal.MatrixExpression(); } */ } namespace Internal { public class MatrixImplementation : Matrix { internal double[] elements; readonly int nrow, ncol; public MatrixImplementation(int dnrow, int dncol) { nrow = dnrow; ncol = dncol; elements = new double[nrow * ncol]; } public override double this[int row, int col] { get { return elements[(row - 1) * ncol + (col - 1)]; } set { elements[(row - 1) * ncol + (col - 1)] = value; } } } public class MatrixExpression : Matrix { MatrixImplementation imp; readonly int nrow, ncol; readonly int drow, dcol; public MatrixExpression(MatrixImplementation target, int ddrow, int ddcol, int dnrow, int dncol) { nrow = dnrow; ncol = dncol; drow = ddrow; dcol = ddcol; imp = target; } public override double this[int row, int col] { get { return imp.elements[(row - drow) * ncol + (col - dcol)]; } set { imp.elements[(row - drow) * ncol + (col - dcol)] = value; } } } } }