Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Перегрузка оператора в generic классе C#

42K
12 ноября 2008 года
Check
8 / / 12.11.2008
Имеется, значит класс TVector<T> - некое подобие вектора STL.
class TVector<T>
{
public T[] mas;
}

Требуется переопределить для сего класса оператор, ну скажем, +, чтобы к каждому элементу массива прибавлял число.
Что-то вроде:
public static TVector<T> operator +(TVector<T> vec, T a);
при таком раскладе компилятор ругается, что мол не может он сложить Т с Т, ибо фиг его знает, может там какой-нить нескладываемый тип.
Если записать что-то типа того:
public static TVector<int> operator +(TVector<int> vec,int a);
он еррорит, типа один из параметров должен быть типа TVector<T> и опять же не компилится.
Проблема решается с помощью условия where на параметр Т, но как конкретно его записать?
241
12 ноября 2008 года
Sanila_san
1.6K / / 07.06.2005
А просто метод для прибавления элемента неудобно? Кстати, если унаследовать TVector от ArrayList, тогда можно использовать его методы, там были AddRange() и Add().
42K
12 ноября 2008 года
Check
8 / / 12.11.2008
Метод или не метод - неважно. Компилятор не будет складывать объекты, не зная, определен ли для них оператор +.

Наследовать ничего нельзя в моём случае...
5
12 ноября 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Check
Метод или не метод - неважно. Компилятор не будет складывать объекты, не зная, определен ли для них оператор +.


В C# не проходят такие вещи. Никаким способом нельзя указать, какие операторы поддерживает тот или иной объект на этапе компиляции. Введение же интерфейсов типа

 
Код:
public interface IArithmetic {
...
    IArithmetic Add(IArithmetic a, IArithemetic b);
...
}
не приведет к искомому результуту - встроенные (примитивные) типы не поддерживают их. С другой стороны можно поступить как в Java для встроенных типов сделать обертку, реализующую эти интерфейсы.
42K
13 ноября 2008 года
Check
8 / / 12.11.2008
блин, всё было бы элементарно, если бы можно было в интерфейс помещать операторы(
5
13 ноября 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Check
блин, всё было бы элементарно, если бы можно было в интерфейс помещать операторы(


Ммм под .NET есть и другие языки, в которых внедрение и перегрузка операторов поддерживается лучше, например в Nemerle можно вообще какие угодно операторы создавать и перегружать: <->, <-- и прочих подобных.

42K
14 ноября 2008 года
Check
8 / / 12.11.2008
Понимаете, стоит задача переписать программу с С++ на С# для университетского курса. А тема лабы - "шаблонные классы". Так что у меня нет свободы выбора языка или средства( Шаг влево-вправо - расстрел за отход от темы...
5
14 ноября 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Check
А тема лабы - "шаблонные классы". Так что у меня нет свободы выбора языка или средства( Шаг влево-вправо - расстрел за отход от темы...


Некоторые возможности C++ не могут быть отражены в C#.
Это относится к произвольной перегрузке операторов.
Генерики C# это далеко не шаблоны. Это самодостаточные типы данных, так что подобный курс невозможно без серьезных изменений отобразить на С#.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог