Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > С#

С# Средство разработки на платформе .Net

Ответ
 
Опции темы
Старый 24.04.2012, 23:41   #1
KingMaks
Знающий
 
Аватар для KingMaks
 
Регистрация: 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
moka
.
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
KingMaks (28.04.2012)
Старый 25.04.2012, 00:49   #3
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Абстрактный класс и наследование

Как-то так:
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)
    {
        
    }

Но как-то оно не очень смотрится...
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
Dream (26.04.2012), KingMaks (28.04.2012)
Старый 26.04.2012, 10:20   #4
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Абстрактный класс и наследование

Я за вариант с приведением типов, как МоКа показал, это самое простое вроде бы.
(Offline)
 
Ответить с цитированием
Старый 26.04.2012, 10:36   #5
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Абстрактный класс и наследование

Я привел решение задачи, а не что проще
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
moka (26.04.2012), Жека (28.04.2012)
Старый 28.04.2012, 05:20   #6
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Абстрактный класс и наследование

pax, я тебя не имел ввиду
(Offline)
 
Ответить с цитированием
Старый 28.04.2012, 18:07   #7
KingMaks
Знающий
 
Аватар для KingMaks
 
Регистрация: 26.11.2009
Сообщений: 313
Написано 35 полезных сообщений
(для 95 пользователей)
Ответ: Абстрактный класс и наследование

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

pax благодарю, помогло!
__________________
StimuL
Maks
(Offline)
 
Ответить с цитированием
Старый 30.04.2012, 06:27   #8
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: Абстрактный класс и наследование

а не лучше перегрузить + ?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Dream (30.04.2012)
Старый 01.05.2012, 20:50   #9
KingMaks
Знающий
 
Аватар для KingMaks
 
Регистрация: 26.11.2009
Сообщений: 313
Написано 35 полезных сообщений
(для 95 пользователей)
Ответ: Абстрактный класс и наследование

Сообщение от radiobutton Посмотреть сообщение
а не лучше перегрузить + ?
говорю же, задание именно функция и именно так как я написал нужно, уже разобрался!
__________________
StimuL
Maks
(Offline)
 
Ответить с цитированием
Старый 01.05.2012, 23:22   #10
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: Абстрактный класс и наследование

Сообщение от KingMaks Посмотреть сообщение
говорю же, задание именно функция и именно так как я написал нужно, уже разобрался!
ну тогда нада статической ее сделать
(Offline)
 
Ответить с цитированием
Старый 03.05.2012, 00:17   #11
KingMaks
Знающий
 
Аватар для KingMaks
 
Регистрация: 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
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Абстрактный класс и наследование

Ну тут вероятно надо
// Конструктор
public QuadMatrix(long n):base(nn
т.к. в базовом классе нет конструктора по умолчанию и надо вызвать один из существующих.

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

Можно было бы попробовать сделать вот так:
abstract class Matrix
{
    public abstract 
T Sum<T> (T AT Bwhere T:Matrix;

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

abstract class Matrix
{

}

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

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

__________________
Blitz3d to Unity Wiki

Последний раз редактировалось pax, 03.05.2012 в 08:18.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
KingMaks (03.05.2012)
Старый 03.05.2012, 17:34   #13
KingMaks
Знающий
 
Аватар для KingMaks
 
Регистрация: 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
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Абстрактный класс и наследование

Переведи задание на русский, я украинский не особо понимаю.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 03.05.2012, 18:59   #15
KingMaks
Знающий
 
Аватар для KingMaks
 
Регистрация: 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)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com