forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   С# (http://forum.boolean.name/forumdisplay.php?f=128)
-   -   Абстрактный класс и наследование (http://forum.boolean.name/showthread.php?t=16695)

KingMaks 24.04.2012 23:41

Абстрактный класс и наследование
 
Собственно есть абстрактный класс
Цитата:

abstract class Matrix
{
// Абстрактная функция сложения
public abstract Matrix Sum(Matrix A, Matrix B );
}
Дочерний класс
Цитата:

class RectMatrix : Matrix
{
Vector[] data;

// Конструкторы
public RectMatrix(long n)
{
data = new Vector[n];
for (int i = 0; i < n; i++)
{
data[i] = new Vector(n);
}
}

public RectMatrix(long n, long m)
{
data = new Vector[m];
for (int i = 0; i < m; i++)
{
data[i] = new Vector(n);
}
}

// Функция сложения
public override RectMatrix Sum(RectMatrix A, RectMatrix B )
{
RectMatrix response = new RectMatrix(A.data.GetLength(0), A.data[0].size());

if ((A.data.GetLength(0) == B.data.GetLength(0)) && (A.data[0].size() == B.data[0].size()))
{
for (int i = 0; i < A.data.GetLength(0); i++)
{
for (int j = 0; j < A.data[0].size(); j++)
{
response.data[i][j] = A.data[i][j] + B.data[i][j];
}
}

return response;
}
else
{
Console.WriteLine("Матрицы невозможно сложить!");
return response;
}
}

}
Наследую класс и нужно, чтоб функция сложения принимала и возвращала уже наследуемый класс, то есть RectMatrix, но выдает ошибку, как же тогда уже в наследуемом классе изменить метод суммы, чтоб она принимала RectMatrix и возвращала результат типа RectMatrix

Главная функция:
Цитата:

RectMatrix Amatrix = new RectMatrix(3, 2);

RectMatrix Bmatrix = new RectMatrix(3, 2);

RectMatrix Cmatrix = new RectMatrix(3, 2);
Cmatrix = Cmatrix.Sum(Amatrix, Bmatrix);

moka 25.04.2012 00:10

Ответ: Абстрактный класс и наследование
 
Объявляемый override метод должен иметь то же возвращаемое данное и параметры, как и объявляемый асбтрактный метод у отцовского класса.

Поменяй метод в классе RectMatrix на:
Код:

public override Matrix Sum(Matrix A, Matrix B )
Затем тебе нужны будут кастинги в этом методе из Matrix в RectMatrix.

И далее делай тоже кастинг:
Код:

Cmatrix = (RectMatrix)Cmatrix.Sum(Amatrix, Bmatrix);
Да и на заметку, код ужасный. И старайся использовать одной размерности массивы чем вложенные, так будет в разы быстрее инициализация.

pax 25.04.2012 00:49

Ответ: Абстрактный класс и наследование
 
Как-то так:
PHP код:

abstract class Matrix<Twhere T:Matrix<T>
{
    
// Абстрактная функция сложения
    
public abstract T Sum(T AT B);
}

class 
RectMatrix Matrix<RectMatrix>
{
    public 
override RectMatrix Sum(RectMatrix ARectMatrix B)
    {
        
    }


Но как-то оно не очень смотрится...

Жека 26.04.2012 10:20

Ответ: Абстрактный класс и наследование
 
Я за вариант с приведением типов, как МоКа показал, это самое простое вроде бы.

pax 26.04.2012 10:36

Ответ: Абстрактный класс и наследование
 
Я привел решение задачи, а не что проще :pardon:

Жека 28.04.2012 05:20

Ответ: Абстрактный класс и наследование
 
pax, я тебя не имел ввиду:)

KingMaks 28.04.2012 18:07

Ответ: Абстрактный класс и наследование
 
Цитата:

Сообщение от MoKa (Сообщение 226388)
Да и на заметку, код ужасный. И старайся использовать одной размерности массивы чем вложенные, так будет в разы быстрее инициализация.

у меня по заданию вложенный массив:)

pax благодарю, помогло!

radiobutton 30.04.2012 06:27

Ответ: Абстрактный класс и наследование
 
а не лучше перегрузить + ?:)

KingMaks 01.05.2012 20:50

Ответ: Абстрактный класс и наследование
 
Цитата:

Сообщение от radiobutton (Сообщение 226844)
а не лучше перегрузить + ?:)

говорю же, задание именно функция и именно так как я написал нужно, уже разобрался!:)

radiobutton 01.05.2012 23:22

Ответ: Абстрактный класс и наследование
 
Цитата:

Сообщение от KingMaks (Сообщение 227000)
говорю же, задание именно функция и именно так как я написал нужно, уже разобрался!:)

ну тогда нада статической ее сделать :)

KingMaks 03.05.2012 00:17

Ответ: Абстрактный класс и наследование
 
pax
Сделал такое наследование, как ты и говорил
Код:

abstract class Matrix<T> where T:Matrix<T>
{
    // Абстрактная функция сложения
    public abstract T Sum(T A, T B);
}

class RectMatrix : Matrix<RectMatrix>
{
    public override RectMatrix Sum(RectMatrix A, RectMatrix B)
    {
       
    }
}

Работает норм, но делаю следующее наследование

Код:

class QuadMatrix : RectMatrix
    {
        int rows;
        int cols;
        Vector[] data;

        // Конструктор
        public QuadMatrix(long n)
        {
            data = new Vector[n];
            for (int i = 0; i < n; i++)
            {
                data[i] = new Vector(n);
            }
        }
    }

и в конструкторе ошибку выдает, как быть?

pax 03.05.2012 06:30

Ответ: Абстрактный класс и наследование
 
Ну тут вероятно надо
PHP код:

// Конструктор
public QuadMatrix(long n):base(nn

т.к. в базовом классе нет конструктора по умолчанию и надо вызвать один из существующих.

И учти, что второе наследование не повлияет на функцию Sum т.е. T уже задан первым наследованием. В ней останутся типы RectMatrix. Тут либо отказаться от такого наследования и делать перегруженные методы, либо наследоваться только от Matrix<T>

Можно было бы попробовать сделать вот так:
PHP код:

abstract class Matrix
{
    public abstract 
T Sum<T> (T AT Bwhere T:Matrix;


Но тогда тебе придется работать с классом Activator для создания экземпляров неизвестного типа... так что не знаю что лучше... может самое правильное сделать перегруженную функцию Sum в каждом классе. Т.е. сделать ее не абстрактной, а просто реализовать нужного вида.

PHP код:

abstract class Matrix
{

}

class 
RectMatrix Matrix
{
    public 
RectMatrix Sum(RectMatrix ARectMatrix B)
    {
        
    }
}

class 
QuadMatrix RectMatrix
{
    public 
QuadMatrix Sum(QuadMatrix AQuadMatrix B)
    {
        
    }



KingMaks 03.05.2012 17:34

Ответ: Абстрактный класс и наследование
 
Цитата:

Сообщение от pax (Сообщение 227124)
Тут либо отказаться от такого наследования и делать перегруженные методы, либо наследоваться только от Matrix<T>

Да я бы и рад отказаться от такого, да задание вообще не радует, в рамки зажали не дают развернутся

Цитата:

1. Створити простір імен Algebra.
2. Розробити клас Vector для маніпуляції з векторами дійсних чисел. У
цього класу повинно бути два поля: count (тип int) – кількість елементів у
масиві і data (масив типу double) – масив з даними. Створити конструктори:
public Vector (long n), який резервує пам’ять для масиву з n елементів,
public Vector (long n, double init), який резервує пам’ять для масиву з n
елементів та ініціалізує кожен елемент значенням init, та
public Vector (double []arr), який створює копію масиву arr10. За
допомогою перезавантаження операцій реалізувати операції суми, різниці,
векторного добутку та доступу за індексом. Реалізувати методи: int size(),
який вертає кількість елементів у масиві, double abs(), який вертає корінь з
суми квадратів координат вектору (при реалізації обов’язково використати
оператор foreach), void read() та void write(), які, відповідно, роблять
консольний ввід та вивід масиву.
3. Створити абстрактний клас Matrix, у якому оголосити абстрактні
операції суми, різниці, добутку, доступу за індексом, методи void read() та
void write().
4. Створити клас RectMatrix, який уточнює (є потомком) клас Matrix. У
класі RectMatrix оголосити поля rows (тип int) – кількість строк у матриці,
cols (тип int) – кількість стовпців у матриці та data (масив типу Vector). У
класі RectMatrix необхідно реалізувати всі абстрактні операції і методи класу
Matrix. Запропонувати сигнатури та відповідні конструктори для гнучкості
ініціалізації матриць.
5. Створити клас QuadMatrix, який уточнює (є потомком) клас
RectMatrix, та додає рекурсивний метод обчислення визначника квадратної
матриці.
10 Для визначення кількості елементів у масиві arr можна скористатися операцією arr.GetLength(0)
31
6. Створити клас SymmetricMatrix, який уточнює (є потомком) клас
QuadMatrix. Клас SymmetricMatrix призначений для зберігання симетричних
матриць, тому необхідно створити відповідні конструктори та перезавантажити
операцію доступу за індексом з розрахунку, що поле data – стрічкова матриця,
яка зберігає тільки верхню половини матриці.
7. Розробити клас Cramer, який складається з двох полів: matrix (тип
QuadMatrix) – матриця СЛАР та vector (тип Vector), який призначений для
розв’язку СЛАР методом Крамера.
8. Навести приклади застосування розроблених методів.
В 6 пункте придется делать еще одно наследование от QuadMatrix:)

Посоветуй как в общем для такого задания лучше организовать наследование, а то каждым способом к разной ошибке прихожу

pax 03.05.2012 18:33

Ответ: Абстрактный класс и наследование
 
Переведи задание на русский, я украинский не особо понимаю.

KingMaks 03.05.2012 18:59

Ответ: Абстрактный класс и наследование
 
Цитата:

Сообщение от pax (Сообщение 227164)
Переведи задание на русский, я украинский не особо понимаю.

1. Создать пространство имен Algebra.
2. Разработать класс Vector манипуляции с векторами действительных чисел. У
этого класса должно быть два поля: count (тип int) - количество элементов в
массиве и data (массив типа double) - массив с данными. Создать конструкторы:
public Vector (long n), который резервирует память для массива из n элементов,
public Vector (long n, double init), который резервирует память для массива из n
элементов и инициализирует каждый элемент значением init и
public Vector (double [] arr), который создает копию массива arr10. Перегрузить операции суммы, разности,
векторного произведения и доступа по индексу. Реализовать методы: int size (),
который возвращает количество элементов в массиве, double abs (), который возвращает корень из
суммы квадратов координат вектора (при реализации обязательно использовать
оператор foreach), void read () и void write (), которые, соответственно, делают
консольный ввод и вывод массива.
3. Создать абстрактный класс Matrix, в котором объявить абстрактные
операции суммы, разности, произведения, доступа по индексу, методы void read () и
void write ().
4. Создать класс RectMatrix, который уточняет (есть потомком) класс Matrix. В
классе RectMatrix объявить поля rows (тип int) - количество строк в матрице,
cols (тип int) - число столбцов матрицы и data (массив типа Vector). В
классе RectMatrix необходимо реализовать все абстрактные операции и методы класса
Matrix.
5. Создать класс QuadMatrix, который уточняет (есть потомком) класс
RectMatrix, и добавляет рекурсивный метод вычисления определителя квадратной матрицы. Для определения количества элементов в массиве arr можно воспользоваться операцией arr.GetLength (0)
6. Создать класс SymmetricMatrix, который уточняет (есть потомком) класса QuadMatrix. Класс SymmetricMatrix предназначен для хранения симметричных матриц, поэтому необходимо создать соответствующие конструкторы и перезагрузить операцию доступа по индексу из расчета, что поле data - ленточная матрица, которая сохраняет только верхнюю половины матрицы.
7. Разработать класс Cramer, который состоит из двух полей: matrix (тип
QuadMatrix) - матрица СЛАУ и vector (тип Vector), который предназначен для решения СЛАУ методом Крамера.
8. Привести примеры применения разработанных методов.


Часовой пояс GMT +4, время: 22:18.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot