![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| PaZ1T1V |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 169 Регистрация: 26.2.2008 Где: Багдад ) Репутация: нет Всего: нет |
Доброго времени суток, уважаемые.
Есть такой вопросец, может кто подскажет, перейдем сразу к нему: Есть базовый абстрактный generic класс Digit<T>, в нем перегружены операторы сравнения и оператооры арифметических действий, есть три класса наследника: Fraction, Double, Complex. Классы Fraction и Double рапботают просто замечательно, но класс Complex должен быть параметризованным, то есть его элементами могут быть как и Double, так и Fraction, итак у нас в итоге есть класс Complex<T1>, если в нем не определить значение типа T1, то он ругается на неопределенные в типе T1 операторы, это и понятно, ему никто не указывал на то, каких классов может быть T1, а если написать Complex<T1> where T1: Digit<Complex<T1>> (ужасная конструкция, но в какой то статье или на форуме я взял такую реализацию и она имеет место быть - работает!!!), то он пишет такую ошибку: The type 'megaCalculator.ComplexDigit<T1>' cannot be used as type parameter 'T' in the generic type or method 'megaCalculator.Digit<T>'. There is no implicit reference conversion from 'megaCalculator.ComplexDigit<T1>' to 'System.IEquatable<megaCalculator.ComplexDigit<T1>>'.я понимаю что это бред, но как с этим бороться ? может кто подскажет ??? А да, забыл, еще определил интерфейс IDigit<T> на уровне с базовым классом, правда не знаю зачем, но сделал это Вот коды классов: а) работают
б) ошибки :((
//а если вот так определить
то ссылается на интерфейс Inconsistent accessibility: constraint type 'megaCalculator.IDigit<megaCalculator.ComplexDigit<T1>>' is less accessible than 'megaCalculator.ComplexDigit<T1>' убираем интерфейс из списка родителей и снова ошибка The type 'megaCalculator.ComplexDigit<T1>' cannot be used as type parameter 'T' in the generic type or method 'megaCalculator.Digit<T>'. There is no implicit reference conversion from 'megaCalculator.ComplexDigit<T1>' to 'System.IEquatable<megaCalculator.ComplexDigit<T1>>'. --------------------
[size=8]Atention please!!![/size] [size=6]Кривые руки[/size] |
||||||
|
|||||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
generic'и с операторами в шарпе не дружат, где-то читал статью на эту тему, что-то говорилось про вывод типов который в C# недоделанный )
-------------------- ![]() |
|||
|
||||
| PaZ1T1V |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 169 Регистрация: 26.2.2008 Где: Багдад ) Репутация: нет Всего: нет |
generic'и с операторами в шарпе не дружат, где-то читал статью на эту тему, что-то говорилось про вывод типов который в C# недоделанный )
Cпасибо за ответ mr.Duda, но, что они не доделанные я не знал.... как то странно все, а как мне быть? МОЖЕТ подскажешь что??? еще раз напомню задачу.... лучше так Digit<T> | ------------------------ | | | Fraction Double Complex<T1> где Т и Т1 - это по сути одно и тоже - это число, только Т = {Fraction, Double, Complex<>}, а Т1 = {Fraction, Double} Как реализовать ???? может можно обойтись как нибудь без параметризации Comlex'a ???? только мне что-то в голову не приходит ничего.... Interface'ами можно конечно, типа Idigit | ------------ | | Ifraction Idouble только мне кажется это гемор еще тот, куча повторяющегося кода будет или я не прав? если нет, то можно ли мне объяснить почему и как это сделать??? а можно ли не перегружать операторы, а воспользоваться какими то системными методами типа Add, Sub and etc... ????? --------------------
[size=8]Atention please!!![/size] [size=6]Кривые руки[/size] |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
PaZ1T1V, компилятор не проглотит арифметические и прочие операторы над типами, которые не указаны явно (а параметризуются в generic-е). Можно извратиться и сделать интерфейсы а-ля INumber с методами Add, Sub и т.п., реализовать враппер над интом и т.п., но это как ты сам понимаешь гемор ещё тот.
В С++ такого ограничения нет. -------------------- ![]() |
|||
|
||||
| PaZ1T1V |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 169 Регистрация: 26.2.2008 Где: Багдад ) Репутация: нет Всего: нет |
ага, понимаю.... гемор это еще тот, а в ++ такого ограничения нету, это я знаю, там с этим делом легче, да, ничего не остается как делать интерфейсы и делать в них методы Addition и еже с ними., такая мысль возникла у меня когда я столкнулся с невозможностью перегрузить операторы для неявных типов, спасиб за ответ, просто я думал есть вариант без "мистер знает толк в извращениях-с" --------------------
[size=8]Atention please!!![/size] [size=6]Кривые руки[/size] |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |