Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2010, 10:26   #1
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
Вопрос Перегрузка операций для созданных шаблонов(C#)

Необходимо на языке C# реализовать класс "Комплексные числа". Разобрался с основной технологией по этому вопросу(как создать основу шаблона, как заполнить поля в шаблоне), но с перегрузкой операций в шаблоне ничего понять не могу.
Пишу код для перегрузки операции "+":
Код:
public static Complex_Digit<Digit_Type> operator+(Complex_Digit<Digit_Type> comp1, Complex_Digit<Digit_Type> comp2)
{
Complex_Digit<Digit_Type> tmp = new Complex_Digit<Digit_Type>();
           tmp.Re = comp1.Re + comp2.Re; //строка 1
tmp.Im = comp1.Im+comp2.Im;  //строка 2
        
           return tmp;
}
В данном коде, Re - действительная часть комплексного числа, Im - мнимая часть. Но почему-то в строчках 1 и 2 компилятор выдает ошибку:"Оператор + не может применяться к операндам типа Digit_Type". Подскажите пожалуйста, что это значит и как избавиться от этой проблемы?
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 28.09.2010, 10:33   #2
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Покажи полный код класса. Компилятор наверное не уверен в том что это числа. Ну т.е.
Нверное шаблон для комплекных чисел - это не очень хорошее рещение. Ну сделай типом вещественные числа и всё будет тип-топ

Последний раз редактировалось Altera; 28.09.2010 в 10:36.
Altera вне форума Ответить с цитированием
Старый 28.09.2010, 10:44   #3
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Цитата:
Сообщение от Altera Посмотреть сообщение
Покажи полный код класса. Компилятор наверное не уверен в том что это числа. Ну т.е.
Нверное шаблон для комплекных чисел - это не очень хорошее рещение. Ну сделай типом вещественные числа и всё будет тип-топ
Необходимо именно реализовать шаблон, типы параметров которого можно задать произвольно(разумеется, они должны быть числами). Код следующий:
public class Complex_Digit< Digit_Type >
{
public Digit_Type Re;
public Digit_Type Im;

public void Push(Digit_Type aRe, Digit_Type aIm)
{
Re = aRe;
Im = aIm;
}

public Complex_Digit<Digit_Type> Pop()
{
return this;
}

public static Complex_Digit<Digit_Type> operator+(Complex_Digit<Digit_Type> any1, Complex_Digit<Digit_Type> any2)
{
Complex_Digit<Digit_Type> tmp = new Complex_Digit<Digit_Type>();
tmp.Re = any1.Re + any2.Re; //компилятору не нравится эта строка и строка ниже
tmp.Im = any1.Im + any2.Im;

return tmp;

}

}
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 28.09.2010, 11:02   #4
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

В вашем случае могло бы помочь ограничение наследования, но в случае арифметики в С# оно не предусмотрено.
Цитата:
Как справиться с арифметикой

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

Как уже говорилось, наличие ограничения операции, где можно было бы указать, что над элементами определена операция +, решало бы проблему. Но такого типа ограничений нет. Хуже того, нет и интерфейса INumeric, аналогичного IComparable, определяющего метод сложения Add. Так что нам не может помочь и ограничение наследования.

Вот один из возможных выходов, предлагаемых в такой ситуации. Стратегия следующая: определим абстрактный универсальный класс Calc с методами, выполняющими вычисления. Затем создадим конкретизированных потомков этого класса. В классе, задающем список с суммированием, введем поле класса Calc. При создании экземпляров класса будем передавать фактические типы ключа и элементов, а также соответствующий калькулятор, но уже не как тип, а как аргумент конструктора класса. Этот калькулятор, согласованный с типом элементов, и будет выполнять нужные вычисления. Давайте приступим к реализации этой стратегии. Начнем с определения класса Calc:

Код:
public abstract class Calc<T>
{
    public abstract T Add(T a, T b);
    public abstract T Sub(T a, T b);
    public abstract T Mult(T a, T b);
    public abstract T Div(T a, T b);
}
Наш абстрактный универсальный класс определяет четыре арифметические операции. Давайте построим трех его конкретизированных потомков:

Код:
public class IntCalc : Calc<int>
{
    public override int Add(int a, int b) { return (a + b);}
    public override int Sub(int a, int b) { return (a - b);}
    public override int Mult(int a, int b) { return (a * b);}
    public override int Div(int a, int b) { return (a / b); }
}
public class DoubleCalc : Calc<double>
{
    public override double Add(double a, double b) 
        {return (a + b);}
    public override double Sub(double a, double b) 
        {return (a - b);}
    public override double Mult(double a, double b) 
        {return (a * b);}
    public override double Div(double a, double b) 
        {return (a / b);}
}
public class StringCalc : Calc<string>
{
    public override string Add(string a, string b) 
        {return (a + b);}
    public override string Sub(string a, string b) 
        {return (a );}
    public override string Mult(string a, string b) 
        {return (a );}
    public override string Div(string a, string b) 
        {return (a);}
}
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Старый 28.09.2010, 11:03   #5
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Далее
Цитата:
Здесь определяются три разных калькулятора: один - над целочисленными данными, другой - над данными с плавающей точкой, третий - над строковыми данными. В последнем случае определена, по сути, только операция сложения строк (конкатенации).

Теперь нам нужно ввести изменения в ранее созданный класс OneLinkList. Обратите внимание на важный технологический принцип работы с объектными системами. Пусть уже есть нормально работающий класс с нормально работающими клиентами класса. Не следует изменять этот класс. Класс закрыт для изменений. Используйте наследование и открывайте класс-потомок, в который и вносите изменения, учитывающие добавляемую специфику класса. Принцип "Закрыт - Открыт" является одним из важнейших принципов построения программных систем в объектном стиле.

В полном соответствии с этим принципом построим класс SumList - потомок класса OneLinkList. То, что родительский класс является универсальным, ничуть не мешает строить потомка класса, сохраняющего универсальный характер родителя.

public class SumList<K, T> : OneLinkList<K, T> where K :
IComparable<K>

{
Calc<T> calc;
T sum;
public SumList(Calc<T> calc)
{ this.calc = calc; sum = default(T); }
public new void add(K key, T item)
{
Node<K, T> newnode = new Node<K, T>();
if (first == null)
{
first = newnode; cursor = newnode;
newnode.key = key; newnode.item = item;
sum = calc.Add(sum, item);
}
else
{
newnode.next = cursor.next; cursor.next = newnode;
newnode.key = key; newnode.item = item;
sum = calc.Add(sum, item);
}
}
public T Sum()
{return (sum); }
}//SumList
А дальше вода...
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.
mrChester вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузка операций для класса дробей Fataller Общие вопросы C/C++ 4 29.05.2010 18:08
перегрузка операций nastya081108 Помощь студентам 0 18.05.2010 21:16
перегрузка операций в си++ Serjuk Общие вопросы C/C++ 9 20.03.2010 21:30
С++ перегрузка операций для шаблонного класса TIN Помощь студентам 7 29.03.2009 15:24