На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 367 368 [369] 370 371 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    Цитата korvin @
    "в других языках не используется в виду отсутсвия необходимости" =)

    Ааааа... Вононочё! Ну, ok, буду знать.
      Цитата korvin @
      но я бы сказал "в других языках не используется в виду отсутсвия необходимости" =)

      Т.е. в других языках их использование возможно, но просто нет необходимости? Или таки их использовать нельзя, в виду отсутствия самой возможности, а посему разговоры об отсутствии необходимости просто не имеют смысла?
        Цитата D_KEY @
        То, что используется в С++, называется Traits class и не имеет отношения к ООП

        Та чо далеко лазить, у нас на форуме есть описание с примерами: traits...
          Цитата korvin @
          "в других языках не используется в виду отсутсвия необходимости" =)

          А к тайпклассам Haskell ты тоже это относишь?

          Добавлено
          Цитата KILLER @
          Цитата D_KEY @
          То, что используется в С++, называется Traits class и не имеет отношения к ООП

          Та чо далеко лазить, у нас на форуме есть описание с примерами: traits...

          О как. Спасибо :)
          korvin, DesweR, можете ознакомиться. А korvin может переписать на Java.
          Сообщение отредактировано: D_KEY -
            Цитата D_KEY @
            Это не мой пример, а твой пример на тайпклассы. Мой код на С++ полностью повторяет функциональность твоего на Haskell, твой на Яве полностью повторяет мой на С++, следовательно, твой на Яве полностью повторяет функциональность твоего же примера на Haskell. Или тут какая-то своя логика должна быть задействована ;) ?

            ок, намекну.

            Хаскелл:
            ExpandedWrap disabled
              class Foo a where
                  foo :: a -> a
               
              instance Foo Int where
                  foo x = x


            С++ (примерно):
            ExpandedWrap disabled
              template<T>
              class Foo<T> {
                  static T foo(T &) = 0
              };
               
              class Foo<Int> {
                  static Int foo(Int &x) { return x; }
              }


            Java (вариант 1):
            ExpandedWrap disabled
              class Foo {
                  static Object foo(Object x) { return null; }
              }
               
              class FooEx extends Foo {
                  static Object foo(Int x) { return x; }
              }

            упс, теряем статическую информацию о типе

            Java (вариант 2):
            ExpandedWrap disabled
              class Foo<T> {
                  static T foo (T x) { return null; }
              }
              ...

            упс, нельзя такого сделать

            Добавлено
            Цитата D_KEY @
            Там показан прием на использования классов-характеристик, который в С++ иногда сокращенно называют просто traits, а не traits class. С чего ты решил приплести сюда ОО-trait'ы мне не понятно.

            с того, что ты-то не смог сразу сказать, что именно тебе нужно, привести ссылку на вики например, я и взял то, что было у меня на слуху
              Цитата korvin @
              упс, нельзя такого сделать

              Угу. В том то и дело, что в плюсах можно влиять на реализацию, не меняя её, а специализируя traits'ы. Попытка заменить это наследованием провалится, потому что реализация (которую мы изменить не можем) должна инстанцировать именно нашего наследника. А возможность параметризовать реализацию нужным нам trait'ом (а не использовать захардкоженный) только расширяет возможности.
                Цитата korvin @
                с того, что ты-то не смог сразу сказать, что именно тебе нужно, привести ссылку на вики например, я и взял то, что было у меня на слуху

                Я сказал, что это идиома С++, сказал как она называется и как название обычно переводят на русский. ИМХО, но этого достаточно для того, чтобы гугл дал тебе нужный результат, как на английском, так и на русском ;)

                Добавлено
                Цитата korvin @
                упс, теряем статическую информацию о типе
                ...
                упс, нельзя такого сделать

                Тогда зачем вообще был нужен этот код, если он не имеет отношения ни к traits class'ам, ни к type class'ам? Ты привел аналог скорее обычной перегрузки функций в С++ :)
                Сообщение отредактировано: D_KEY -
                  Цитата D_KEY @
                  Т.е. в других языках их использование возможно, но просто нет необходимости? Или таки их использовать нельзя, в виду отсутствия самой возможности, а посему разговоры об отсутствии необходимости просто не имеют смысла?

                  отсутствует необходимость.

                  в Go "методы" (характеристики) можно добавлять к типу независимо от типа. в статике.
                  в Typed Racket можно воспользоваться макросистемой и реализовать все что угодно.
                  в Хаскелле тайпклассы достаточно удобны (и судя по всему практически аналогичны этим вашим трейтам).
                  в Джаве вполне достаточно возможностей перегрузки и перекрытия статических методов.

                  про динамически типизированные вообще молчу, там и так че угодно натворить можно =) но, конечно, если для вас из качеств трейтов статичность важнее того, что они позволяют "расширить" набор операций над объектом, то динамика в пролете.

                  кстати о джаве, я немного поспешил в предыдущем посте. можно так:
                  ExpandedWrap disabled
                    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'ам? Ты привел аналог скорее обычной перегрузки функций в С++ :)

                  затем, что он полностью повторяет смысл твоего примера, с вот этой небольшой поправкой, которую, как оказалось можно обойти
                  Сообщение отредактировано: korvin -
                    Цитата korvin @
                    эээ... ты не понял? я наследую не класс объекта, а класс-трейт, тем самым расширяя и или конкретизируя реализацию

                    Я очень рад. Но у меня уже есть код, который в качестве trait'а использует Bar. Теперь заставьте его использовать ваш Buz.
                      Цитата korvin @
                      в Go "методы" (характеристики) можно добавлять к типу независимо от типа. в статике.

                      А типы там можно втуда добавлять? И причем тут методы?

                      Цитата
                      в Хаскелле тайпклассы достаточно удобны (и судя по всему практически аналогичны этим вашим трейтам).

                      Так с этого все и началось :) Я тебя хотел спросить про различия.

                      Цитата
                      в Джаве вполне достаточно возможностей перегрузки и перекрытия статических методов.

                      Интересно, а почему тогда их недостаточно в С++, если там все тоже самое?
                      Нет, не достаточно :)

                      Цитата
                      но, конечно, если для вас из качеств трейтов статичность важнее того, что они позволяют "расширить" набор операций над объектом, то динамика в пролете.

                      traits работают с типами, а не объектами.

                      Цитата
                      кстати о джаве, я немного поспешил в предыдущем посте. можно так:
                      ExpandedWrap disabled
                        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));
                            }
                        }



                      Как этот код связан с обсуждением? На С++ аналог выглядит так:
                      ExpandedWrap disabled
                        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.
                      Сообщение отредактировано: D_KEY -
                        Цитата D_KEY @
                        А типы там можно втуда добавлять? И причем тут методы?

                        а зачем? покажи пример
                          Цитата korvin @
                          Цитата D_KEY @
                          А типы там можно втуда добавлять? И причем тут методы?

                          а зачем? покажи пример

                          Я уже говорил о char_traits, а также о iterator_traits и предоставляемый там тип категории итератора.
                          Вот пример std::iterator_traits + специализация для указателей(которые по сути являются итераторами произвольного доступа).
                          ExpandedWrap disabled
                              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;
                              };
                            Цитата D_KEY @
                            Так с этого все и началось :) Я тебя хотел спросить про различия.

                            пожалуйста: в Хаскелле мы не можем иметь одновременно обобщенную реализацию какого-то "метода" и конкретную
                            ExpandedWrap disabled
                              class Eq a where
                                (==) :: a -> a -> Bool
                                (/=) :: a -> a -> Bool

                            либо мы определяем (/=) в тайпклассе Eq как
                            ExpandedWrap disabled
                                x /= y  =  not $ x == y

                            либо мы пишем ее для каждого инстанса. в общем-то в данном случае выбор очевидин, так что это не проблема.
                            если мы определили инстанс для обобщенного типа
                            ExpandedWrap disabled
                              instance Eq ([] a) where
                                [] == []  =  True
                                [] == ys  =  False
                                xs == []  =  False
                                (x:xs) == (y:ys)  =  x == y && xs == ys

                            то не можем определить инстанс для конкретного [Int] например.

                            проще говоря, никаких перекрытий.
                            Сообщение отредактировано: korvin -
                              Вот вроде бы первая статья на тему от автора подхода. Прочти, сделай милость.
                                Цитата D_KEY @
                                traits работают с типами, а не объектами.

                                по-твоему в динамике нет типов? o_O'
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 367 368 [369] 370 371 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.5167 ]   [ 14 queries used ]   [ Generated: 30.07.26, 21:24 GMT ]