Как реализовать чистый инициализатор пользовательских объектов для класса Matrix
У меня есть обычай Matrix
класс, в котором я хотел бы реализовать собственный инициализатор объекта, аналогичный тому, который может использовать double[,], но не могу понять, как его реализовать.
В идеале хотелось бы, чтобы это выглядело так
var m1 = new Matrix
{
{ 1.0, 3.0, 5.0 },
{ 7.0, 1.0, 5.0 }
};
на данный момент у меня есть обычный конструктор с подписью
public Matrix(double[,] inputArray){...}
который принимает вызов как этот
var m1 = new Matrix(new double[,]
{
{ 1.0, 3.0, 5.0 },
{ 7.0, 1.0, 5.0 }
});
и объектный инициализатор, который принимает следующее использование, наследуя IEnumerable<double[]>
интерфейс и реализация публичной пустоты Add(double[] doubleVector)
метод
var m2 = new Matrix
{
new [] { 1.0, 3.0, 5.0 },
new [] { 7.0, 1.0, 5.0 }
};
когда я пытаюсь использовать объектный инициализатор, я хотел бы получить ошибку компилятора из-за отсутствия перегрузки для Add
это принимает X количество аргументов, где X - количество столбцов, которые я пытаюсь создать (т.е. в моих предоставленных примерах 3).
Как я могу настроить свой класс так, чтобы он использовал аргумент, который я предоставил?
1 ответ
Определять Add
метод с params
ключевое слово и игнорировать конечный элемент в массиве, который длиннее ширины матрицы
public void Add(params double[] doubleVector)
{
// code
}
если массив короче, элементы по умолчанию остаются (0
)
// sample
var M = new Matrix()
{
{ 1.2, 1.0 },
{ 1.2, 1.0, 3.2, 3.4}
};