Объявите 2D-массив различных типов объектов в зависимости от того, если еще (или переключатель) c # - PullRequest
0 голосов
/ 14 февраля 2019

Я работаю с матрицей и у меня проблемы с тем, как правильно инициализировать разные 2D-массивы объектов, когда их тип зависит от условия (если еще).Если я объявлю матрицу и ее тип раньше, если еще, то я не могу объявить различные типы внутри.Если я объявлю это, если это не так, он не существует вне области видимости.

По переполнению стека уже есть похожие вопросы, и я нашел несколько подходов, как решить эту проблему.

  1. Поместите все методы (даже не перегруженные - делающие одинаково для обоих типов) внутри, если еще.-> Это работает, но код повторяется.
  2. Создайте общий интерфейс.-> Методы не работали с ICell, и я не мог понять, перепечатывая ICell [] [] в CellA [] [].
  3. Объявление матрицы как массива массивов переменных.-> Не могу понять, как это работает.

Есть ли другой вариант и какое решение лучше?Или мой подход полностью неверен?

Спасибо

PS Код длинный, и это упрощенная версия.

class CellA : IComparable {
    // 2 attributes
    //constructor 1 param
    public int CompareTo(object obj) {
        //code
    }
}

class CellB : CellA {  
    // 3 attributes  
    //constructor 2 params  
}

class Program {    
    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
        if (mode) {
            CellA[][] matrix = InitializeMatrixA(data[indexOfSet]);
        } else {
            CellB[][] matrix = InitializeMatrixB(data[indexOfSet]);
        }
        DoSomethingOther(ref matrix);
        //several ref matrix manipulation methods
        Console.WriteLine(DoSomethingSame(matrix));
    }

    static CellA[][] InitializeMatrixA(string data) {
        //string processing, not important
        CellA[][] matrix = new CellA[9][];
        for (int i = 0; i < 9; i++) {
            matrix[i] = new Cell[9];
            for (int j = 0; j < 9; j++) {
                matrix[i][j] = new CellA(stringPart[i*9+j]);
            }
        }
        return matrix;
    }

    static CellB[][] InitializeMatrixB(string data) {
        //different string processing, not important
        CellB[][] matrix = new CellB[9][];
        for (int i = 0; i < 9; i++) {
            matrix[i] = new Cell[9];
            for (int j = 0; j < 9; j++) {
                matrix[i][j] = new CellA(stringPart[i*18+j*2], stringPart[i*18+j*2+1]);
            }
        }
        return matrix;
    }
    //same function for As and Bs
    static int DoSomethingSame(ref CellA[][] matrix) { //code }

    //many different overloaded methods all working with reference to "matrix", slightly different computing for As and Bs
    static void DoSomethingOther(ref CellA[][] matrix) { //code }
    static void DoSomethingOther(ref CellB[][] matrix) { // slightly different code}

1 Ответ

0 голосов
/ 14 февраля 2019

Ну, на мой взгляд, второе решение, которое вы разместили, было бы лучшим решением, общий интерфейс под названием 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);

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...