Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 367 368 [369] 370 371 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#5521
,
|
|
|
|
Ааааа... Вононочё! Ну, ok, буду знать. |
|
Сообщ.
#5522
,
|
|
|
|
Т.е. в других языках их использование возможно, но просто нет необходимости? Или таки их использовать нельзя, в виду отсутствия самой возможности, а посему разговоры об отсутствии необходимости просто не имеют смысла? |
|
Сообщ.
#5523
,
|
|
|
|
|
Сообщ.
#5524
,
|
|
|
|
А к тайпклассам Haskell ты тоже это относишь? Добавлено Цитата KILLER @ О как. Спасибо korvin, DesweR, можете ознакомиться. А korvin может переписать на Java. |
|
Сообщ.
#5525
,
|
|
|
|
Цитата D_KEY @ Это не мой пример, а твой пример на тайпклассы. Мой код на С++ полностью повторяет функциональность твоего на Haskell, твой на Яве полностью повторяет мой на С++, следовательно, твой на Яве полностью повторяет функциональность твоего же примера на Haskell. Или тут какая-то своя логика должна быть задействована ?ок, намекну. Хаскелл: ![]() ![]() class Foo a where foo :: a -> a instance Foo Int where foo x = x С++ (примерно): ![]() ![]() template<T> class Foo<T> { static T foo(T &) = 0 }; class Foo<Int> { static Int foo(Int &x) { return x; } } Java (вариант 1): ![]() ![]() class Foo { static Object foo(Object x) { return null; } } class FooEx extends Foo { static Object foo(Int x) { return x; } } упс, теряем статическую информацию о типе Java (вариант 2): ![]() ![]() class Foo<T> { static T foo (T x) { return null; } } ... упс, нельзя такого сделать Добавлено Цитата D_KEY @ Там показан прием на использования классов-характеристик, который в С++ иногда сокращенно называют просто traits, а не traits class. С чего ты решил приплести сюда ОО-trait'ы мне не понятно. с того, что ты-то не смог сразу сказать, что именно тебе нужно, привести ссылку на вики например, я и взял то, что было у меня на слуху |
|
Сообщ.
#5526
,
|
|
|
|
Цитата korvin @ упс, нельзя такого сделать Угу. В том то и дело, что в плюсах можно влиять на реализацию, не меняя её, а специализируя traits'ы. Попытка заменить это наследованием провалится, потому что реализация (которую мы изменить не можем) должна инстанцировать именно нашего наследника. А возможность параметризовать реализацию нужным нам trait'ом (а не использовать захардкоженный) только расширяет возможности. |
|
Сообщ.
#5527
,
|
|
|
|
Цитата korvin @ с того, что ты-то не смог сразу сказать, что именно тебе нужно, привести ссылку на вики например, я и взял то, что было у меня на слуху Я сказал, что это идиома С++, сказал как она называется и как название обычно переводят на русский. ИМХО, но этого достаточно для того, чтобы гугл дал тебе нужный результат, как на английском, так и на русском Добавлено Цитата korvin @ упс, теряем статическую информацию о типе ... упс, нельзя такого сделать Тогда зачем вообще был нужен этот код, если он не имеет отношения ни к traits class'ам, ни к type class'ам? Ты привел аналог скорее обычной перегрузки функций в С++ |
|
Сообщ.
#5528
,
|
|
|
|
Цитата D_KEY @ Т.е. в других языках их использование возможно, но просто нет необходимости? Или таки их использовать нельзя, в виду отсутствия самой возможности, а посему разговоры об отсутствии необходимости просто не имеют смысла? отсутствует необходимость. в Go "методы" (характеристики) можно добавлять к типу независимо от типа. в статике. в Typed Racket можно воспользоваться макросистемой и реализовать все что угодно. в Хаскелле тайпклассы достаточно удобны (и судя по всему практически аналогичны этим вашим трейтам). в Джаве вполне достаточно возможностей перегрузки и перекрытия статических методов. про динамически типизированные вообще молчу, там и так че угодно натворить можно =) но, конечно, если для вас из качеств трейтов статичность важнее того, что они позволяют "расширить" набор операций над объектом, то динамика в пролете. кстати о джаве, я немного поспешил в предыдущем посте. можно так: ![]() ![]() package test2; class Bar { public static int f(int x) { return x; } } class Buz extends Bar { public static double f(double x) { return x; } } public class App { public static void main(String[] args) { System.out.println(Buz.f(1)); System.out.println(Buz.f(1.0)); } } Добавлено Цитата MyNameIsIgor @ Угу. В том то и дело, что в плюсах можно влиять на реализацию, не меняя её, а специализируя traits'ы. Попытка заменить это наследованием провалится, потому что реализация (которую мы изменить не можем) должна инстанцировать именно нашего наследника. А возможность параметризовать реализацию нужным нам trait'ом (а не использовать захардкоженный) только расширяет возможности. эээ... ты не понял? я наследую не класс объекта, а класс-трейт, тем самым расширяя и или конкретизируя реализацию, а поскольку в трейте методы статические, то ничего инстанциировать не нужно. собственно все как в примере D_KEY'а Добавлено Цитата D_KEY @ Тогда зачем вообще был нужен этот код, если он не имеет отношения ни к traits class'ам, ни к type class'ам? Ты привел аналог скорее обычной перегрузки функций в С++ ![]() затем, что он полностью повторяет смысл твоего примера, с вот этой небольшой поправкой, которую, как оказалось можно обойти |
|
Сообщ.
#5529
,
|
|
|
|
Цитата korvin @ эээ... ты не понял? я наследую не класс объекта, а класс-трейт, тем самым расширяя и или конкретизируя реализацию Я очень рад. Но у меня уже есть код, который в качестве trait'а использует Bar. Теперь заставьте его использовать ваш Buz. |
|
Сообщ.
#5530
,
|
|
|
|
Цитата korvin @ в Go "методы" (характеристики) можно добавлять к типу независимо от типа. в статике. А типы там можно втуда добавлять? И причем тут методы? Цитата в Хаскелле тайпклассы достаточно удобны (и судя по всему практически аналогичны этим вашим трейтам). Так с этого все и началось Я тебя хотел спросить про различия.Цитата в Джаве вполне достаточно возможностей перегрузки и перекрытия статических методов. Интересно, а почему тогда их недостаточно в С++, если там все тоже самое? Нет, не достаточно Цитата но, конечно, если для вас из качеств трейтов статичность важнее того, что они позволяют "расширить" набор операций над объектом, то динамика в пролете. traits работают с типами, а не объектами. Цитата кстати о джаве, я немного поспешил в предыдущем посте. можно так: ![]() ![]() package test2; class Bar { public static int f(int x) { return x; } } class Buz extends Bar { public static double f(double x) { return x; } } public class App { public static void main(String[] args) { System.out.println(Buz.f(1)); System.out.println(Buz.f(1.0)); } } Как этот код связан с обсуждением? На С++ аналог выглядит так: ![]() ![]() int f(int x) { return x; } double f(double x) { return x; } int main() { std::cout << f(1) << std::endl; std::cout << f(1.0) << std::endl; } Добавлено И да, тот мой перевод твоего кода, можно переписать с использованием перегрузки, и именно поэтому я и назвал traits там "странными" Хотя даже такие traits смогут дать большую гибкость. А приводил я тот код для иллюстрации схожести с type class'ами haskell. |
|
Сообщ.
#5531
,
|
|
|
|
Цитата D_KEY @ А типы там можно втуда добавлять? И причем тут методы? а зачем? покажи пример |
|
Сообщ.
#5532
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ А типы там можно втуда добавлять? И причем тут методы? а зачем? покажи пример Я уже говорил о char_traits, а также о iterator_traits и предоставляемый там тип категории итератора. Вот пример std::iterator_traits + специализация для указателей(которые по сути являются итераторами произвольного доступа). ![]() ![]() template <class Iterator> struct iterator_traits { typedef typename Iterator::iterator_category iterator_category; typedef typename Iterator::value_type value_type; typedef typename Iterator::difference_type difference_type; typedef typename Iterator::pointer pointer; typedef typename Iterator::reference reference; }; template <class T> struct iterator_traits<T*> { typedef random_access_iterator_tag iterator_category; typedef T value_type; typedef ptrdiff_t difference_type; typedef T* pointer; typedef T& reference; }; |
|
Сообщ.
#5533
,
|
|
|
|
Цитата D_KEY @ Так с этого все и началось Я тебя хотел спросить про различия.пожалуйста: в Хаскелле мы не можем иметь одновременно обобщенную реализацию какого-то "метода" и конкретную ![]() ![]() class Eq a where (==) :: a -> a -> Bool (/=) :: a -> a -> Bool либо мы определяем (/=) в тайпклассе Eq как ![]() ![]() x /= y = not $ x == y либо мы пишем ее для каждого инстанса. в общем-то в данном случае выбор очевидин, так что это не проблема. если мы определили инстанс для обобщенного типа ![]() ![]() instance Eq ([] a) where [] == [] = True [] == ys = False xs == [] = False (x:xs) == (y:ys) = x == y && xs == ys то не можем определить инстанс для конкретного [Int] например. проще говоря, никаких перекрытий. |
|
Сообщ.
#5535
,
|
|
|
|
Цитата D_KEY @ traits работают с типами, а не объектами. по-твоему в динамике нет типов? o_O' |