Объектно-ориентированное программирование на С#. Андрианова А.А - 94 стр.

UptoLike

94
Эта ошибка связана с невозможностью преобразования объекта
базового класса к производному типу. При использовании операции "*"
происходят два вида преобразования типов:
При передаче параметров (операнды квадратные матрицы x и z,
преобразуются к типу базового класса). Это преобразование
происходит без ошибок, поскольку объект производного класса
принадлежит одновременно базовому классу. Это называют
принципом подставимости.
При возвращении операцией матрицы-результата и сохранении
результата в объекте QMatrix должно производиться обратное
преобразование из Matrix в QMatrix. Это преобразование
невозможно, поэтому и возникает ошибка.
Для исправления этой ошибки нужно добавить в базовый класс
Matrix специальный метод ToQMatrix(), который осуществляет
преобразование из типа Matrix в QMatrix:
// метод преобразования объекта класса Matrix в QMatrix
public QMatrix ToQMatrix()
{
int rows = Rows;
QMatrix qm = new QMatrix(rows);
for (int i = 0; i < rows; i++)
for (int j = 0; j < rows; j++)
qm[i, j] = a[i, j];
return qm;
}
В этом методе создается объект производного класса и его элементам
присваиваются значения из элементов объекта базового класса.
. . .
z = ~x;
z.OutputMatrix();
Console.WriteLine("Проверка правильности
обратной матрицы:");
y = (x * z).ToQMatrix();
y.OutputMatrix();
. . .
     Эта ошибка связана с невозможностью преобразования объекта
базового класса к производному типу. При использовании операции "*"
происходят два вида преобразования типов:
      При передаче параметров (операнды – квадратные матрицы x и z,
       преобразуются к типу базового класса). Это преобразование
       происходит без ошибок, поскольку объект производного класса
       принадлежит одновременно базовому классу. Это называют
       принципом подставимости.
      При возвращении операцией матрицы-результата и сохранении
       результата в объекте QMatrix должно производиться обратное
       преобразование – из Matrix в QMatrix. Это преобразование
       невозможно, поэтому и возникает ошибка.

     Для исправления этой ошибки нужно добавить в базовый класс
Matrix специальный метод ToQMatrix(), который осуществляет
преобразование из типа Matrix в QMatrix:

     // метод преобразования объекта класса Matrix в QMatrix
     public QMatrix ToQMatrix()
     {
        int rows = Rows;
        QMatrix qm = new QMatrix(rows);
        for (int i = 0; i < rows; i++)
           for (int j = 0; j < rows; j++)
              qm[i, j] = a[i, j];
        return qm;
     }

     В этом методе создается объект производного класса и его элементам
присваиваются значения из элементов объекта базового класса.

       .    .    .
     z = ~x;
     z.OutputMatrix();

     Console.WriteLine("Проверка правильности
                                обратной матрицы:");
     y = (x * z).ToQMatrix();
     y.OutputMatrix();
       .    .    .




94