Путаница с типом данных при наследовании ToString () из базового класса - PullRequest
0 голосов
/ 27 мая 2011

Я пишу библиотеку классов на C # для работы с матрицами, и в настоящее время я работаю над подклассом Matrix, который называется ComplexMatrix.Базовый класс Matrix работает со значениями типа данных Int32 (более продвинутая версия использует Double) и ComplexMatrix структуры System.Numerics.Complex (.NET 4).

Для базового класса Iпереопределить ToString () как:

| 1 2 |
| 3 4 |    printed as    {{1,2}{3,4}}

Структура System.Numerics.Complex переопределяет ToString () в виде:

a+bi    printed as    (a,b)    where a is real and b is imaginary

При переопределении ToString в ComplexMatrix я просто использовал метод:

public override string ToString()
{
    return base.ToString();
}

К сожалению, для сложной матрицы произошло следующее:

| 1+1i 1+2i |
| 2+1i 2+2i |   printed as   {{0,0}{0,0}} rather than {{(1,1),(1,2)}{(2,1)(2,2)}}

Исходный код ToString (), который я написал для класса Matrix:

public override string ToString()
{
    StringBuilder matrixString = new StringBuilder();
    string comma = "";

    matrixString.Append("{");
    for (int i = 0; i < this.Rows; i++)
    {
        matrixString.Append("{");
        for (int j = 0; j < this.Columns; j++)
        {
            if (j == 0) comma = "";
            else comma = ",";

            matrixString.Append(comma + this.Elements[i, j].ToString());
        }
        matrixString.Append("}");
    }
    matrixString.Append("}");
    return matrixString.ToString();
}

В приведенном выше коде:

  • this.Elements Свойство: в классе Matrix это двумерный массив типа Int32 (Double в более новой, более продвинутой версии);он имеет тип System.Numerics.Complex в ComplexMatrix
  • this.Rows, this.Columns Свойства: количество строк и столбцов матрицы соответственно

У меня есть несколько вопросов::

  • Когда ToString вызывается для экземпляра ComplexMatrix и вызывает базовый метод ToString (), выполняется ли попытка преобразования типа из Complex в Int32?
  • в качестве элементов ComplexMatrixСвойство (тип Complex [,]) скрывает свойство Elements базового класса (тип Int32 [,]), требуется новое ключевое слово?
  • Видится ли ключевое слово this в качестве типа Matrix, а не ComplexMatrix?

Ответы [ 2 ]

2 голосов
/ 27 мая 2011

Я думаю, что ваша проблема заключается в следующем:
Свойство Elements не помечено virtual в классе Matrix. Свойство Elements в классе ComplexMatrix скрывает свойство Elements класса Matrix. Поэтому полиморфизм не работает, и метод ToString в Matrix обращается к Matrix.Elements, а не ComplexMatrix.Elements. Но поскольку Elements является свойством, и вы хотите изменить тип свойства, вы все равно не можете использовать virtual.

Чтобы устранить проблему, вы должны сделать что-то вроде этого:

  • Создайте базовый класс общего типа, который хочет, чтобы тип значений матрицы использовался в качестве универсального параметра
  • Создайте класс SimpleMatrix, который наследуется от этого базового класса и передает int в качестве универсального параметра.
  • Создайте класс ComplexMatrix, который наследуется от этого базового класса и передает Complex в качестве универсального параметра.
0 голосов
/ 27 мая 2011

Вы не можете делать то, что пытаетесь сделать.

Проблема в том, что в C # нет суперкласса для всех числовых типов. Таким образом, вы не можете реально заменить один числовой тип на другой в иерархии классов, подобной этой (и все же делать с ними математику).

Что вы можете сделать, это создать интерфейс IMatrixElement. Затем создайте конкретные классы MatrixElementInt, MatrixElementDouble, MatrixElementComplex, которые реализуют этот интерфейс. Затем укажите правильный тип элемента при построении матрицы.

interface IMatrixElement
{
    IMatrixElement Add(IMatrixElement a, IMatrixElement b);
    IMatrixElement Multiply(IMatrixElement a, IMatrixElement b);
    string ToString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...