Ну, на мой взгляд, второе решение, которое вы разместили, было бы лучшим решением, общий интерфейс под названием ICell.
Я бы справился с этим, создав ICell следующим образом: нет необходимости в реф.Модификатор, массивы, естественно, передаются по ссылке.
public interface ICell
{
int DoSomethingSame(ICell[][] matrix);
void DoSomethingOther(ICell[][] matrix);
}
, а затем я бы создал классы: CellA, CellB и заставил бы каждый реализовывать интерфейс ICell по своей собственной логике.Каждый конструктор класса ячейки определяет логику InitializeMatrix своей собственной логикой.Поэтому, когда вы создаете экземпляр класса, он уже инициализирует матрицу.
А затем в основном:
static void Main(string[] args)
{
data[0] = "...";
...
data[x] = "...";
//user input own data or chooses data set
...
bool mode = true/false; //user chooses computing mode
ICell[][] matrix = (mode)? new CellA(data[indexOfSet]): new CellB(data[indexOfSet])
DoSomethingOther(ref matrix);
//several ref matrix manipulation methods
Console.WriteLine(DoSomethingSame(matrix));
}
Если вам нужны примеры, как определить CellA и CellB, дайте мне знать ия обновлю.
РЕДАКТИРОВАТЬ: полное решение будет:
public class Matrix
{
ICell[][] cell;
public Matrix(bool mode, string data)
{
cell = (mode)? new CellA(data): new CellB(data);
}
}
Я бы реализовать методы doSomething внутри класса.
, а затем в основной:
static void Main(string[] args)
{
data[0] = "...";
...
data[x] = "...";
//user input own data or chooses data set
...
bool mode = true/false; //user chooses computing mode
Matrix matrix = new Matrix(mode, data[indexOfSet]);
matrix.DoSomethingOther();
//several ref matrix manipulation methods
Console.WriteLine(matrix.DoSomethingSame);
}