Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 357 358 [359] 360 361 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#5371
,
|
|
|
|
Эммм... Ну, вот в случае концептов принцип подстановки не работает ![]() ![]() template<typename T : I> List<T> f2(T obj1, T obj2) { I i = x; //не верно, вообще, полностью } А в коде ![]() ![]() List<T extends I> f2(T x, T y) { I i = x; // работает } Собственно, что и показывалось для тайпклассов. С другой стороны, если интерфейсы как в Go, то и первый код рабочий. Тогда вообще размывается граница. |
|
Сообщ.
#5372
,
|
|
|
|
перепиши без шаблона =) Добавлено Цитата MyNameIsIgor @ С другой стороны, если интерфейсы как в Go, то и первый код рабочий. Тогда вообще размывается граница. эм, всмысле? который код? разница между чем и чем размывается? |
|
Сообщ.
#5373
,
|
|
|
|
Цитата korvin @ эм, всмысле? который код? разница между чем и чем размывается? Разница между не-типом (тайпклассом/концептом) и типом (интерфейсом), при том, что описано это как одна сущность. Цитата korvin @ перепиши без шаблона =) Мб лучше вам прочитать про концепты? Здесь первый пост, объясняется на примерах кода, здесь поясняется словами, но примеры какие-то с ошибками... как будто смещены, т.е. когда пишут "этот пример" смотреть надо следующий |
|
Сообщ.
#5374
,
|
|
|
|
Цитата korvin @ перепиши без шаблона =) Зачем ?Ты понимаешь код только на Haskell-подобном языке? Хорошо: ![]() ![]() concept I a where ... data A = A data B = B instance I A where ... instance I B where ... f1 :: [I] f1 = [A, B] -- работает f2 :: I a => [a] f2 = [A, B] -- не работает |
|
Сообщ.
#5375
,
|
|
|
|
Цитата MyNameIsIgor @ Разница между не-типом (тайпклассом/концептом) и типом (интерфейсом), при том, что описано это как одна сущность. а при чем тут тогда "интерфейсы как в Go"? их "утиность" никак не способствует размыванию разницы между интерфейсами и тайпклассами. Цитата D_KEY @ Зачем ?затем, что ты говоришь, что концепты справляются и с задачей интерфейсов, и с задачей тайпклассов, но используешь при этом шаблоны. |
|
Сообщ.
#5376
,
|
|
|
|
Цитата korvin @ а при чем тут тогда "интерфейсы как в Go"? их "утиность" никак не способствует размыванию разницы между интерфейсами и тайпклассами. Я хз как лучше пояснить мои мысли... |
|
Сообщ.
#5377
,
|
|
|
|
Цитата korvin @ ты говоришь, что концепты справляются и с задачей интерфейсов, и с задачей тайпклассов, но используешь при этом шаблоны. Потому, что в С-подобном языке шаблоны и дженерики единственное подходящее и правильное место для задания ограничений на тип. |
|
Сообщ.
#5378
,
|
|
|
|
Цитата D_KEY @ Потому, что в С-подобном языке шаблоны и дженерики единственное подходящее и правильное место для задания ограничений на тип. хорошее объяснение, мне нравится. ок, допустим, template у тебя просто как аналог instance в хаскелле. тогда скажи, является ли A наследником I (применительно к первому случаю)? |
|
Сообщ.
#5379
,
|
|
|
|
Цитата korvin @ ок, допустим, template у тебя просто как аналог instance в хаскелле. Строго говоря, таким аналогом в случае концептов является concept map или тот гипотетический неявный инстанс, который получается, когда тип и так соответствует концепту. Цитата тогда скажи, является ли A наследником I (применительно к первому случаю)? Классы не наследуют от интерфейсов даже по ОО-понятиям Если мы отделяем "интерфейсы"(концепты) от абстрактных ОО-классов, то нет, не является |
|
Сообщ.
#5380
,
|
|
|
|
Цитата D_KEY @ Хорошо: ![]() ![]() concept I a where ... data A = A data B = B instance I A where ... instance I B where ... f1 :: [I] f1 = [A, B] -- работает f2 :: I a => [a] f2 = [A, B] -- не работает теперь что получается, помимо того, что из-за наследования с перекрытием методов мы не можем сказать какой точно код будет выполнен, так еще и в зависимости от типа функции один и тот же объект может выполнить разный код? Добавлено Цитата D_KEY @ Классы не наследуют от интерфейсов даже по ОО-понятиям Если мы отделяем "интерфейсы"(концепты) от абстрактных ОО-классов, то нет, не является ![]() не придирайся к словам, ты понял, что я про субтипирование =) |
|
Сообщ.
#5381
,
|
|
|
|
Цитата korvin @ теперь что получается, помимо того, что из-за наследования с перекрытием методов мы не можем сказать какой точно код будет выполнен Ты о чем сейчас? И вообще, если ты о С++, ты мы уже давно вышли за рамки его возможностей Цитата так еще и в зависимости от типа функции один и тот же объект может выполнить разный код? Чего? Какой один и тот же объект выполнит разный код? И да, [A, B] в первом случае не должно работать - тут должен быть какой-то иной синтаксис |
|
Сообщ.
#5382
,
|
|
|
|
т.е. смотри:
![]() ![]() concept C a where foo :: a -> Void data A = A where foo :: A -> Void foo x = println "A.foo" instance C A where foo :: A -> Void foo x = println "C A.foo" f1 :: C -> Void f1 x = x.foo f2 :: C A -> Void f2 x = x.foo f1 A -- "A.foo" f2 A -- "C A.foo" ? |
|
Сообщ.
#5383
,
|
|
|
|
Цитата korvin @ не придирайся к словам, ты понял, что я про субтипирование =) Я немного не согласен с тем, чтобы смешивать абстрактные типы с типами данных. Как раз в Haskell есть типы данных(через алгебраические типы данных) и тайпклассы, которые позволяют описывать интерфейс объекта и абстрагироваться от конкретного типа(т.е. по сути являются средством описания абстрактных типов). Хотя допускаю, что я просто плохо "понял" Haskell. |
|
Сообщ.
#5384
,
|
|
|
|
это даже тайпчек не должно проходить =)
|
|
Сообщ.
#5385
,
|
|
|
|
Цитата korvin @ т.е. смотри: ![]() ![]() concept C a where foo :: a -> Void data A = A where foo :: A -> Void foo x = println "A.foo" instance C A where foo :: A -> Void foo x = println "C A.foo" f1 :: C -> Void f1 x = x.foo f2 :: C A -> Void f2 x = x.foo f1 A -- "A.foo" f2 A -- "C A.foo" ? В обоих случаях должно быть "C A foo", т.к. ты явно указал instance C для A |