Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 368 369 [370] 371 372 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#5536
,
|
|
|
|
Цитата korvin @ пожалуйста: в Хаскелле мы не можем иметь одновременно обобщенную реализацию какого-то "метода" и конкретную ... если мы определили инстанс для обобщенного типа ![]() ![]() instance Eq ([] a) where [] == [] = True [] == ys = False xs == [] = False (x:xs) == (y:ys) = x == y && xs == ys то не можем определить инстанс для конкретного [Int] например. Т.е. тайпклассы менее гибкие? Жаль. Хотя мне кажется, что тайпклассы где-то между traits и интерфейсами. |
|
Сообщ.
#5537
,
|
|
|
|
|
Сообщ.
#5538
,
|
|
|
|
Цитата D_KEY @ Как этот код связан с обсуждением? На С++ аналог выглядит так: ![]() ![]() 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; } ну ты же знаешь, почему в С++ так можно, а в джаве нет, твое замечание немного не в тему. ты бы мог указать на более очевидный и значимый недостаток в джавокоде =) |
|
Сообщ.
#5539
,
|
|
|
|
Цитата korvin @ ты бы мог указать на более очевидный и значимый недостаток в джавокоде =) Причем тут недостатки, когда код просто не относится к обсуждению? |
|
Сообщ.
#5540
,
|
|
|
|
Цитата 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; }; я нифига не понял, зачем это нужно и почему без этого обойтись нельзя. Добавлено Цитата D_KEY @ Т.е. тайпклассы менее гибкие? Жаль. Хотя мне кажется, что тайпклассы где-то между traits и интерфейсами. т.е. тайпклассы более строгие, простые, очевидные, предсказуемые. никаких сюрпризов. а шаблоны менее гибкие, чем макросы CL и Scheme. жаль Добавлено Цитата D_KEY @ Ты забыл свои слова? Я отвечал на "расширить набор операций над объектами". а что, в ![]() ![]() PointTraits<T>::getX(point); point -- это тип, а getX -- операция над типом? цель-то использования трейтов какая? |
|
Сообщ.
#5541
,
|
|
|
|
Цитата korvin @ я нифига не понял, зачем это нужно и почему без этого обойтись нельзя. Я приводил пример. Функция advance, продвигающая итератор вперед на заданное число позиций, работает по разному с разными видами итераторов. Так, для итераторов произвольного доступа это можно сделать за одну операцию. А вообще обойтись можно без чего угодно практически. brainfuck же тьюринг-полный язык, почему им не воспользоваться? Цитата т.е. тайпклассы более строгие, простые, очевидные, предсказуемые. никаких сюрпризов. А какие сюрпризы с шаблонами? Цитата а шаблоны менее гибкие, чем макросы CL и Scheme. жаль У них совершенно разные юзкейсы. Цитата цель-то использования трейтов какая? Прочитай уже статью, что я давал. |
|
Сообщ.
#5542
,
|
|
|
|
Цитата korvin @ Можно. Но после знакомства с фичей и осознания её потенциала, если её отобрать, будет неудобно и грустно.я нифига не понял, зачем это нужно и почему без этого обойтись нельзя. Цитата korvin @ Как обычно, в инкапсуляции - отделении структуры абстракции от её поведения (имеется ввиду определение инкапсуляции по Бучу). цель-то использования трейтов какая? |
|
Сообщ.
#5543
,
|
|
|
|
Цитата D_KEY @ Я приводил пример. Функция advance, продвигающая итератор вперед на заданное число позиций, работает по разному с разными видами итераторов. Так, для итераторов произвольного доступа это можно сделать за одну операцию. и что? трейты-то тут что дают? Цитата D_KEY @ А какие сюрпризы с шаблонами? мы уже это обсуждали. Цитата D_KEY @ У них совершенно разные юзкейсы. о, ну конечно, перечисли юзкейсы шаблонов. Цитата D_KEY @ Прочитай уже статью, что я давал. я-то прочитал, мне твое мнение не очень понятно. Добавлено Цитата Qraizer @ Как обычно, в инкапсуляции - отделении структуры абстракции от её поведения (имеется ввиду определение инкапсуляции по Бучу). это прекрасно делается и без [таких] трейтов |
|
Сообщ.
#5544
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Я приводил пример. Функция advance, продвигающая итератор вперед на заданное число позиций, работает по разному с разными видами итераторов. Так, для итераторов произвольного доступа это можно сделать за одну операцию. и что? трейты-то тут что дают? ![]() ![]() //... typedef /*...*/ iterator_category; //... А дальше через перегрузку функций по этому типу. Цитата мы уже это обсуждали. И к чему пришли? Цитата о, ну конечно, перечисли юзкейсы шаблонов. Создания обобщенных алгоритмов и структур данных. Цитата Цитата D_KEY @ Прочитай уже статью, что я давал. я-то прочитал, мне твое мнение не очень понятно. Эм.. Мне нравится эта идиома А сама она хорошо в статье описана. Добавлено Цитата korvin @ Цитата Qraizer @ Как обычно, в инкапсуляции - отделении структуры абстракции от её поведения (имеется ввиду определение инкапсуляции по Бучу). это прекрасно делается и без [таких] трейтов Пока твои примеры на яве только перегрузку функций эмулировали. |
|
Сообщ.
#5545
,
|
|
|
|
Цитата D_KEY @ И к чему пришли? ни к чему, каждый остался при своем мнении. Цитата D_KEY @ Создания обобщенных алгоритмов и структур данных. а макросы с этим не справляются? Цитата D_KEY @ Эм.. Мне нравится эта идиома А сама она хорошо в статье описана.я спрашивал о целях ее применения. ты их можешь назвать? вон, Qraizer назвал -- инкапсуляция по Бучу. в статье также описана пара случаев применения, я не об этом. Цитата D_KEY @ Пока твои примеры на яве только перегрузку функций эмулировали. не эмулировали, это и есть перегрузка. методов. но я о другом. о том, что цели применения трейтов легко достигаются и без них. |
|
Сообщ.
#5546
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Создания обобщенных алгоритмов и структур данных. а макросы с этим не справляются? Макросы нужны для другого Цитата Цитата D_KEY @ Эм.. Мне нравится эта идиома А сама она хорошо в статье описана.я спрашивал о целях ее применения. ты их можешь назвать? Гибкое(расширяемое и настраиваемое) использование различной информации о "типах". Или тебе не понятно, зачем эта информация нужна? Не очень понимаю, что тебе непонятно. Цитата вон, Qraizer назвал -- инкапсуляция по Бучу. Скорее это пример абстракции. Цитата о том, что цели применения трейтов легко достигаются и без них. Да, а вместо виртуальных функций можно добавлять в объект указатель на таблицу с указателями на функции. Очень удобно |
|
Сообщ.
#5547
,
|
|
|
|
Во-первых, не так легко, как с ними. В конце концов и динамический полиморфизм легко получается без виртуальных методов и вообще классов, достаточно иметь некие кортежи данных, например C-шные структуры, функции, принимающие их параметрами, и массивы указателей на кортежи таких функций. Cшная потоковая библиотека ввода/вывода, чей интерфейс документирован в stdio.h - прекрасный пример такой библиотеки (с учётом, что полиморфность там скрыта как деталь реализации, потому и недокументируется, но в любой реализации, не завязанной жёстко на платформу, что характерно для встроенных систем - да можно просто в gcc посмотреть - она там присутствует в лице предоставляемых пользователем/разработчиком функций, отвечающими за непосредственный обмен данными с внешними носителями).
Во-вторых, не так уж легко во всех случаях. Несложно добавить свойства к своему классу каким-нибудь наследованием, но как их добавить к POD-типам, в частности стандартным? А так имеем ![]() ![]() template <typename Char, typename Traits = char_traits<Char> > class basic_string; В-третьих, свойства являются частным случаем паттерна Стратегии. Если подходить с обобщённой позиции, то свойства - это политика поведения, и она просто должна быть отделена от сушности, чьи свойства она описывает. Всякие там наследования тут не к месту совершенно. |
|
Сообщ.
#5548
,
|
|
|
|
Цитата Qraizer @ Во-вторых, не так уж легко во всех случаях. Несложно добавить свойства к своему классу каким-нибудь наследованием, но как их добавить к POD-типам, в частности стандартным? А так имеем ![]() ![]() template <typename Char, typename Traits = char_traits<Char> > class basic_string; В-третьих, свойства являются частным случаем паттерна Стратегии. Если подходить с обобщённой позиции, то свойства - это политика поведения, и она просто должна быть отделена от сушности, чьи свойства она описывает. Всякие там наследования тут не к месту совершенно. при чем тут наследование? в нормальных языках методы отделены от типа и/или их свободно можно добавлять когда нужно =) Haskell: ![]() ![]() class Property a wnere property :: a -> String instance Property Int where property i = case i of 0 -> "zero" 1 -> "one" ... 9 -> "nine" n -> "very big number" Go: ![]() ![]() func (i int) Property () { switch i { case 0: return "zero" ... default: return "very big number" } } CL: ![]() ![]() (defmethod property ((i integer)) (case i (0 "zero") ... (else "very big number"))) в Ruby и Kotlin тоже можно, в Objective-C вроде можно через протоколы а про стратегии я тебе уже говорил о ФВП |
|
Сообщ.
#5549
,
|
|
|
|
Цитата korvin @ Haskell: Ты фактически показал тоже самое, что и делают traits class |
|
Сообщ.
#5550
,
|
|
|
|
Цитата D_KEY @ Да, а вместо виртуальных функций можно добавлять в объект указатель на таблицу с указателями на функции. Очень удобно ![]() в объект-то зачем? если мы говорим о статически-типизированных языках, то эту таблицу можно добавить в тип. в динамически типизированных да, необходимо в объекте иметь метку типа, ну так она в любом случае там есть, в чем проблема? дополнительную информацию при этом можно хранить где угодно |