|
С# Средство разработки на платформе .Net |
24.04.2012, 23:41
|
#1
|
Знающий
Регистрация: 26.11.2009
Сообщений: 313
Написано 35 полезных сообщений (для 95 пользователей)
|
Абстрактный класс и наследование
Собственно есть абстрактный класс
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);
|
__________________
StimuL
Maks
|
(Offline)
|
|
25.04.2012, 00:10
|
#2
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Абстрактный класс и наследование
Объявляемый override метод должен иметь то же возвращаемое данное и параметры, как и объявляемый асбтрактный метод у отцовского класса.
Поменяй метод в классе RectMatrix на:
public override Matrix Sum(Matrix A, Matrix B )
Затем тебе нужны будут кастинги в этом методе из Matrix в RectMatrix.
И далее делай тоже кастинг:
Cmatrix = (RectMatrix)Cmatrix.Sum(Amatrix, Bmatrix);
Да и на заметку, код ужасный. И старайся использовать одной размерности массивы чем вложенные, так будет в разы быстрее инициализация.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.04.2012, 00:49
|
#3
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Абстрактный класс и наследование
Как-то так:
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) { } }
Но как-то оно не очень смотрится...
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
|
|
26.04.2012, 10:20
|
#4
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Абстрактный класс и наследование
Я за вариант с приведением типов, как МоКа показал, это самое простое вроде бы.
|
(Offline)
|
|
26.04.2012, 10:36
|
#5
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Абстрактный класс и наследование
Я привел решение задачи, а не что проще
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
|
|
28.04.2012, 05:20
|
#6
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Абстрактный класс и наследование
pax, я тебя не имел ввиду
|
(Offline)
|
|
28.04.2012, 18:07
|
#7
|
Знающий
Регистрация: 26.11.2009
Сообщений: 313
Написано 35 полезных сообщений (для 95 пользователей)
|
Ответ: Абстрактный класс и наследование
Сообщение от MoKa
Да и на заметку, код ужасный. И старайся использовать одной размерности массивы чем вложенные, так будет в разы быстрее инициализация.
|
у меня по заданию вложенный массив
pax благодарю, помогло!
__________________
StimuL
Maks
|
(Offline)
|
|
30.04.2012, 06:27
|
#8
|
Бывалый
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений (для 546 пользователей)
|
Ответ: Абстрактный класс и наследование
а не лучше перегрузить + ?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
01.05.2012, 20:50
|
#9
|
Знающий
Регистрация: 26.11.2009
Сообщений: 313
Написано 35 полезных сообщений (для 95 пользователей)
|
Ответ: Абстрактный класс и наследование
Сообщение от radiobutton
а не лучше перегрузить + ?
|
говорю же, задание именно функция и именно так как я написал нужно, уже разобрался!
__________________
StimuL
Maks
|
(Offline)
|
|
01.05.2012, 23:22
|
#10
|
Бывалый
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений (для 546 пользователей)
|
Ответ: Абстрактный класс и наследование
Сообщение от KingMaks
говорю же, задание именно функция и именно так как я написал нужно, уже разобрался!
|
ну тогда нада статической ее сделать
|
(Offline)
|
|
03.05.2012, 00:17
|
#11
|
Знающий
Регистрация: 26.11.2009
Сообщений: 313
Написано 35 полезных сообщений (для 95 пользователей)
|
Ответ: Абстрактный класс и наследование
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);
}
}
}
и в конструкторе ошибку выдает, как быть?
__________________
StimuL
Maks
|
(Offline)
|
|
03.05.2012, 06:30
|
#12
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Абстрактный класс и наследование
Ну тут вероятно надо
// Конструктор public QuadMatrix(long n):base(n, n)
т.к. в базовом классе нет конструктора по умолчанию и надо вызвать один из существующих.
И учти, что второе наследование не повлияет на функцию Sum т.е. T уже задан первым наследованием. В ней останутся типы RectMatrix. Тут либо отказаться от такого наследования и делать перегруженные методы, либо наследоваться только от Matrix<T>
Можно было бы попробовать сделать вот так:
abstract class Matrix { public abstract T Sum<T> (T A, T B) where T:Matrix; }
Но тогда тебе придется работать с классом Activator для создания экземпляров неизвестного типа... так что не знаю что лучше... может самое правильное сделать перегруженную функцию Sum в каждом классе. Т.е. сделать ее не абстрактной, а просто реализовать нужного вида.
abstract class Matrix {
}
class RectMatrix : Matrix { public RectMatrix Sum(RectMatrix A, RectMatrix B) { } }
class QuadMatrix : RectMatrix { public QuadMatrix Sum(QuadMatrix A, QuadMatrix B) { } }
Последний раз редактировалось pax, 03.05.2012 в 08:18.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
03.05.2012, 17:34
|
#13
|
Знающий
Регистрация: 26.11.2009
Сообщений: 313
Написано 35 полезных сообщений (для 95 пользователей)
|
Ответ: Абстрактный класс и наследование
Сообщение от pax
Тут либо отказаться от такого наследования и делать перегруженные методы, либо наследоваться только от 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
Посоветуй как в общем для такого задания лучше организовать наследование, а то каждым способом к разной ошибке прихожу
__________________
StimuL
Maks
|
(Offline)
|
|
03.05.2012, 18:33
|
#14
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Абстрактный класс и наследование
Переведи задание на русский, я украинский не особо понимаю.
|
(Offline)
|
|
03.05.2012, 18:59
|
#15
|
Знающий
Регистрация: 26.11.2009
Сообщений: 313
Написано 35 полезных сообщений (для 95 пользователей)
|
Ответ: Абстрактный класс и наследование
Сообщение от pax
Переведи задание на русский, я украинский не особо понимаю.
|
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. Привести примеры применения разработанных методов.
__________________
StimuL
Maks
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:47.
|