Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 311 312 [313] 314 315 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#4681
,
|
|
|
|
Так причем тут фабрика, если ты пишешь: Цитата DesweR @ В догонку тебе, запроси интерфейс, неизвестный на этапе компиляции, у объекта, тоже неизвестного на этапе компиляции. Это как понять? Я понимаю буквально, т.е. запрашиваю интерфейс, о котором мне неизвестно ничего, и начинаю с ним работать. На С++, такое можно попытатся сделать с помощью шаблонов, и то, оно будет известно на этапе компиляции, ибо толку нет работать с какими то данными, о которых представления не имеешь. А на делфи, у тебя даже метод: ![]() ![]() function Get<T>: IInterface; Возвращает вполне известный интерфейс IInterface . Ты прежде чем писать такое, подумай что пишешь, иначе ты попросту вводишь людей в заблуждение. Так ведь ты сам сказал, что : Цитата TBC1 и TBC2 реализуют только интерфейсы IB и IC, указанные явно в декларации, но никак не интерфейс IA, несмотря даже на то, что он является их базовым. Т.е. по сути у тебя есть реализация интерфейсов IB и IC, но нет реализации интерфейса IA, от которого наследуются IB и IC. И как потом с этим работать? Может быть я чтото не уловил? |
|
Сообщ.
#4682
,
|
|
|
|
Дьявол кроется в деталях, а допустима ли будет утиная типизация, если у класса часть "реализованных" (аналогичных по сигнатуре) методов будет в приватной секции?
|
|
Сообщ.
#4683
,
|
|
|
|
Цитата DesweR @ Дьявол кроется в деталях, а допустима ли будет утиная типизация, если у класса часть "реализованных" (аналогичных по сигнатуре) методов будет в приватной секции? Нет, не допустима. |
|
Сообщ.
#4684
,
|
|
|
|
Цитата MyNameIsIgor @ Как вообще описать, что если я сделаю pop после push, то получу вставленный элемент? ![]() Математически? С помощью инварианта: top(push(s, x)) = x |
|
Сообщ.
#4685
,
|
|
|
|
Цитата scorpion @ Это как понять? Я понимаю буквально, т.е. запрашиваю интерфейс, о котором мне неизвестно ничего, и начинаю с ним работать. Буквально не надо, естественно ты знаешь какие конкретные реализации регистрируешь и какие конкретные интерфейсы запрашиваешь, но самой фабрике заранее это неизвестно. Цитата scorpion @ Возвращает вполне известный интерфейс IInterface. Известный? Это базовый интерфейс, возвращается то - что запросили (либо не возвращается). Корректнее так то так: ![]() ![]() function Get<T: IInterface>: T; Цитата scorpion @ Т.е. по сути у тебя есть реализация интерфейсов IB и IC, но нет реализации интерфейса IA, от которого наследуются IB и IC. И как потом с этим работать? Может быть я чтото не уловил? Всё правильно, реализуются явно указанные интерфейсы, такова идеология COM. Пол года назад уже был разговор: Цитата Это отчасти вытекает из идеологии COM'а, интерфейс - это абстрактный протокол, который описывает только взаимодействие с объектом и не содержит детали его реализации. Возьмём класс X, реализующий некоторый функционал, класс X могут наследовать несколько других классов XA, XB, XC, в этом случае они наследуют и расширяют функционал родительского класса X, но никак его не замещают и не ограничивают, работает принцип подстановки Лисков, мы можем создать объект любого из дочерних классов, привести его к базовому и спокойно работать. Теперь возьмём интерфейс Y, описывающий некоторый абстрактный протокол, этот интерфейс могут реализовывать несколько классов YA, YB, YC, в этом случае они "наследуют" и реализовывают протокол взаимодействия и т.к. никакой базовой реализации у интерфейса нет - YA, YB, YC реализовывают протокол взаимодействия полностью сами, при этом теперь никем не гарантируется, что будет работать принцип подстановки Лисков, даже несмотря на схожесть сигнатур интерфейса, семантика его реализаций может быть различной (собственно в COM даже рекомендуется давать наименования методам с неопределённым смыслом, чтобы каждая реализация интерфейса могла их интерпретировать по своему). Тоже самое касается и наследования интерфейсов, должен соблюдаться не только сигнатурный контракт, но и гарантированно семантический, а для этого класс A, должен содержать реализацию интерфейсов и child и parent. Добавлено Цитата MyNameIsIgor @ Нет, не допустима. В таком случае все варианты, когда реализация должна быть скрыта в классе, идут лесом. Оно вообще тогда надо? |
|
Сообщ.
#4686
,
|
|
|
|
Цитата DesweR @ Всё правильно, реализуются явно указанные интерфейсы, такова идеология COM. Пол года назад уже был разговор: Ну и там же явно сказано: Цитата DesweR @ Тоже самое касается и наследования интерфейсов, должен соблюдаться не только сигнатурный контракт, но и гарантированно семантический, а для этого класс A, должен содержать реализацию интерфейсов и child и parent. |
|
Сообщ.
#4687
,
|
|
|
|
Цитата DesweR @ В таком случае все варианты, когда реализация должна быть скрыта в классе, идут лесом. Оно вообще тогда надо? Не понял... |
|
Сообщ.
#4688
,
|
|
|
|
Цитата DesweR @ В таком случае все варианты, когда реализация должна быть скрыта в классе, идут лесом. Оно вообще тогда надо? ты что-то путаешь. объясни, что ты имеешь в виду. |
|
Сообщ.
#4689
,
|
|
|
|
DesweR, это подправление здорово изменило отношения классов. Это ли не редизайн? Интересно будет послушать твоего коллегу, который после такой небольшой подправки получит у себя поведение, описываемое Flex Ferrum-ом.
Та я знаю, что не так всё просто. И понимаю, почему так сделали там-то и там-то. И С++ часто ругают именно за то, что он позволяет делать что-то вот так, хотя правильно вот эдак. Но почему-то в холиварах это же подаётся как достоинство . Редко восстребованная фича, когда всё-таки требуется, реализуемая не эдак, лучше, нежели невозможная к реализации без костылей.К сожалению. Но если есть альтернатива, то выбор ИМХО однозначен. Дык я и не спорю. Просто интерфейсы обычно так не реализуются. А "так" они реализуются с получением опыта "не так", каковой весьма не следует из архитектур упомянутых языков и фреймворков. Что значит, как? Конечно же явным указанием отношениями между интерфесом и его реализацей. Это я понимаю. Потому и спрашиваю. Вон, DesweR рассказывает, как неизвестный при компиляции <T> может быть в run-time получен от неизвестного при компиляции объекта, и тем самым запросто заюзан неизвестный при компиляции интерфейс. Что-то не вяжется. |
|
Сообщ.
#4690
,
|
|
|
|
Цитата Qraizer @ Дык я и не спорю. Просто интерфейсы обычно так не реализуются. А "так" они реализуются с получением опыта "не так", каковой весьма не следует из архитектур упомянутых языков и фреймворков. Обычно на интерфейсах делают что-то вроде плагинов как раз. Это подразумевает именно подключаемую в процессе сборки объекта конкретную реализацию ![]() Цитата Qraizer @ Вон, DesweR рассказывает, как неизвестный при компиляции <T> может быть в run-time получен от неизвестного при компиляции объекта, и тем самым запросто заюзан неизвестный при компиляции интерфейс. Что-то не вяжется. НАсчет неизвестного инетрфейса ничего не знаю. А вот известный интерфейс от неизвестного объекта вполне нормально получить и заюзать как часть функционала своего объекта. |
|
Сообщ.
#4691
,
|
|
|
|
Это-то как раз неудивительно.
![]() ![]() template <typename I, typename T> I& queryInterface(T& src) { return dynamic_cast<I&>(src); } IA& A = queryInterface<IA>(object); IB& B = queryInterface<IB>(object); |
|
Сообщ.
#4692
,
|
|
|
|
Цитата Qraizer @ Редко восстребованная фича, когда всё-таки требуется, реализуемая не эдак, лучше, нежели невозможная к реализации без костылей. При этом в С++ почему-то нет, например, нормального метапрограммирования, поддержки создания DSL, нормальных лямбд, мультиметодов(хотя было неплохое предложение), поддержки аспектно-ориентированного программирования, DbC(тоже было хорошее предложение) и т.д. и т.п. И исправить/добавить это пользователи языка не могут... Есть не очень успешные попытки это делать, как раз на страшных костылях... |
|
Сообщ.
#4693
,
|
|
|
|
Цитата D_KEY @ поддержки аспектно-ориентированного программирования Эту фичу вообще мало кто "искаропки" поддерживает. Насколько я знаю, в джаве и дотнете библиотеки, реализующие АОП, занимаются или рефлексией, или ещё более мерзопакостной правкой байт-кода. Ну, а из реализаций для плюсов мне приглянулась эта, но я не пробовал. |
|
Сообщ.
#4694
,
|
|
|
|
Цитата MyNameIsIgor @ Цитата D_KEY @ поддержки аспектно-ориентированного программирования Эту фичу вообще мало кто "искаропки" поддерживает. Я имел не встроенное в язык средство, а, скажем так, возможность реализации пользователями языка. Цитата Peter Norvig In Lisp, if you want to do aspect-oriented programming, you just do a bunch of macros and you're there. In Java, you have to get Gregor Kiczales to go out and start a new company, taking months and years and try to get that to work. Lisp still has the advantage there, it's just a question of people wanting that. |
|
Сообщ.
#4695
,
|
|
|
|
D_KEY, никто не будет в один язык запихивать вообще всё, что напридумано в области дискретной математики за 60 лет. В язык вводится то, что восстребовано в достаточной степени. Вот и всё. Множественное наследование реализаций дельфийцами не восстребовано (в немалой степени благодаря пропаганде поставщика средства разработки, впрочем). Нормальное метапрограммирование не восстребовано плюсовиками. Мультиметоды реализуются без костылей, да и необходимость в них не так уж очевидна. Без нормальных лямбд императив обойдётся, вполне достаточно той функциональщины, которая восстребована сейчас. Она 9 лет назад ещё не была восстребована вообще, STL показала вектор, а там как само восстребовалось, так и воплотилось.
|