Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 137 138 [139] 140 141 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#2071
,
|
|
|
|
|
Сообщ.
#2072
,
|
|
|
|
Цитата MyNameIsIgor @ Ну, я же осиливал эту кучу мусора от криворукого кодера. Почему бы вам не ответить мне тем же? Или вам Цитата так и запишем: идиоматический ООП-код в C++ не работает а танцы со ссылками и переопределениями операторов, когда в других языках все просто, мне не очень интересны =) |
|
Сообщ.
#2073
,
|
|
|
|
Пусть лучше знатоки интерфейсов расскажут, как они обходят ситуации с коллизиями имён методов разных интерфейсов.
|
|
Сообщ.
#2074
,
|
|
|
|
мне достаточно приведенной картинки и многочисленных (и, что важно, похожих) впечатлений в интернетах =) Добавлено Цитата Qraizer @ Пусть лучше знатоки интерфейсов расскажут, как они обходят ситуации с коллизиями имён методов разных интерфейсов. если в стат.типизированном ЯП: 1) совпадают только имена, количество и типы параметров разные -- просто два перегруженных метода. ты ж с Java знаком? 2) совпадают полностью сигнатуры -- никакой колизии, просто один и тот же метод, в чем проблема? пересечение множеств всего-навсего в дин.типизированном Racket в интерфейсах задаются только имена, потому для него справедлив только пункт 2, ситуация под пунктом 1 просто невозможна. т.е. это не является коллизией в общем-то. хотя как именно ведет себя C# и Delphi в таких ситуациях, я не знаю, сужу по Java/Go/Racket |
|
Сообщ.
#2075
,
|
|
|
|
Цитата Qraizer @ Пусть лучше знатоки интерфейсов расскажут, как они обходят ситуации с коллизиями имён методов разных интерфейсов. ![]() ![]() type ta = class(TInterfacedObject,IIntf1,IIntf2) procedure f1; procedure IIntf1.f = f1; procedure f2; procedure IIntf2.f = f2; end; |
|
Сообщ.
#2076
,
|
|
|
|
Цитата MyNameIsIgor @ Да Боже упаси утверждать, что они делают фантастическое. Просто они делают достаточно, чтобы во многом облегчить жизнь программиста на C++. ну дык дженерики делают все тоже самое, только что в рантайме, зато без километровых сообщений об ошибках |
|
Сообщ.
#2077
,
|
|
|
|
Которые пришлось специально вводить как языковые конструкции. Фразу "специально вводить" понимаешь? И разницу между "специально вводить" и "реализовать имеющимися средствами".
Добавлено Цитата korvin @ И поиск ошибок в рантайме. ну дык дженерики делают все тоже самое, только что в рантайме |
|
Сообщ.
#2078
,
|
|
|
|
Цитата korvin @ а танцы со ссылками и переопределениями операторов, когда в других языках все просто, мне не очень интересны =) "Танцы со сслыками"? Какие танцы? То, что f1 и f2 вызывается с аргументами по ссылке? Это что ли танцы? А где там "переопределение" операторов то? Вы бы сначала хоть что-нибудь о C++ узнали бы, а то у меня тут два человека уже колики себе заработали, когда я им этот пост показал - пожалейте людей! Впрочем, специально для вашей испорченной функциональными языками психики, могу привести пример попроще, сделав его из того недокода быдлокодера, который вы предоставили. Уж извините, самые откровенные ляпы исходного аффтара пришлось поправить... ![]() ![]() class IA { public: virtual void f() = 0; }; class IB : public IA { public: virtual void g() = 0; }; class A : public IA { public: virtual void f() {} }; class IB2 : public IB { void f() { IB_f(); } public: virtual void IB_f() = 0; }; class B : public A, public IB2 { public: virtual void g() {} virtual void IB_f() { A::f(); } }; int main() { B b; b.IB_f(); b.g(); return 0; } Цитата korvin @ мне достаточно приведенной картинки и многочисленных (и, что важно, похожих) впечатлений в интернетах =) Странно... Мне, видимо, попадаются исключительно противоположные, но тоже друг на друга похожие, да, впечатления. Цитата korvin @ ну дык дженерики делают все тоже самое, только что в рантайме Да не то же самое... |
|
Сообщ.
#2079
,
|
|
|
|
Цитата trainer @ Которые пришлось специально вводить как языковые конструкции. Фразу "специально вводить" понимаешь? И разницу между "специально вводить" и "реализовать имеющимися средствами". конечно понимаю, вот в CL взяли и ввели средствами языка мощную ОО-систему, которой можно удобно пользоваться без кучи сопроводительного мусора, а не то, что Игорь привел. вот в C#, Delphi нет таких средств, они и взяли сделали абстракцию частью языка изнутри, зато этим пользоваться удобно, и без шансов где-то забыть поставить очередной virtual Добавлено Цитата MyNameIsIgor @ Цитата korvin @ а танцы со ссылками и переопределениями операторов, когда в других языках все просто, мне не очень интересны =) "Танцы со сслыками"? Какие танцы? То, что f1 и f2 вызывается с аргументами по ссылке? Это что ли танцы? А где там "переопределение" операторов то? Вы бы сначала хоть что-нибудь о C++ узнали бы, а то у меня тут два человека уже колики себе заработали, когда я им этот пост показал - пожалейте людей! Впрочем, специально для вашей испорченной функциональными языками психики, могу привести пример попроще, сделав его из того недокода быдлокодера, который вы предоставили. Уж извините, самые откровенные ляпы исходного аффтара пришлось поправить... ![]() ![]() class IA { public: virtual void f() = 0; }; class IB : public IA { public: virtual void g() = 0; }; class A : public IA { public: virtual void f() {} }; class IB2 : public IB { void f() { IB_f(); } public: virtual void IB_f() = 0; }; class B : public A, public IB2 { public: virtual void g() {} virtual void IB_f() { A::f(); } }; int main() { B b; b.IB_f(); b.g(); return 0; } еще раз повторяю: Цитата так и запишем: идиоматический ООП-код в C++ не работает и какой еще IB_f? в исходном C#-коде нет никакого IB_f |
|
Сообщ.
#2080
,
|
|
|
|
Цитата korvin @ и какой еще IB_f? в исходном C#-коде нет никакого IB_f И что? У нас тут занятия по теме "напишем на языке А в точности как на языке B"? Я думал, что поставлена задача, которую надо было решить. Кстати, давайте самую малость усложним пример ![]() ![]() #include <iostream> class IA { public: virtual void f() = 0; }; class IB : public IA { public: virtual void g() = 0; }; class A : public IA { public: virtual void f() { std::cout << "A::f()" << std::endl; } }; class IB2 : public IB { void f() { IB_f(); } public: virtual void IB_f() = 0; }; class B : public A, public IB2 { public: virtual void g() { std::cout << "B::g()" << std::endl; } virtual void IB_f() { std::cout << "B::f()" << std::endl; } }; void f1(IA& iface) { iface.f(); } void f2(IB& iface) { iface.f(); iface.g(); } int main() { B b; f1(static_cast<A&>(b)); f2(b); return 0; } с выводом ![]() ![]() A::f() B::f() B::g() |
|
Сообщ.
#2081
,
|
|
|
|
во-первых, IB2 у Вас уже не интерфейс, из-за наличия в нем реализации метода;
во-вторых, поскольку B наследует A, который реализует IA, то B должен автоматически считаться реализующим IA и передаваться в f1 без всяких static_cast. так ведут себя все ЯП с интерфейсами; в-третьих, у нас нет задачи решить задачу более сложно, чем в оригинале, т.к. это fail для решающего, а в последнем примере Вы вообще все запутали непонятно зачем. Добавлено а, пардон, static_cast умышленно был сделан; тоже не очень-то соотвествует ООП |
|
Сообщ.
#2082
,
|
|
|
|
Цитата korvin @ во-первых, IB2 у Вас уже не интерфейс, из-за наличия в нем реализации метода; Не интерфейс. Вас буковка I смущает? Вы думаете, что её сложно убрать? Цитата korvin @ во-вторых, поскольку B наследует A, который реализует IA, то B должен автоматически считаться реализующим IA и передаваться в f1 без всяких static_cast А он реализует IA. Но по-разному Потому и нужно приведение типов.Цитата korvin @ так ведут себя все недоезыги без множественного наследования Цитата korvin @ в-третьих, у нас нет задачи решить задачу более сложно, чем в оригинале Вернее сказать, не было. Я её предложил. Имею ведь я право предложить задачу? Цитата korvin @ а в последнем примере Вы вообще все запутали непонятно зачем. Что вам не понятно? Просто использование множественного наследования. Мне интересно, как вы сделаете на языках без оного. Добавлено Цитата korvin @ а, пардон, static_cast умышленно был сделан; тоже не очень-то соотвествует ООП Странное какое-то у вас представление о ООП... |
|
Сообщ.
#2083
,
|
|
|
|
Цитата MyNameIsIgor @ Странное какое-то у вас представление о ООП... да в общем-то почти такое же, как у одного из основателей: Цитата OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things. It can be done in Smalltalk and in LISP. There are possibly other systems in which this is possible, but I'm not aware of them. Cheers, Alan статический полиморфизм сюда никак не вписывается Цитата MyNameIsIgor @ Не интерфейс. Вас буковка I смущает? Вы думаете, что её сложно убрать? да, она ввела меня в заблуждение, зачем Вы запутываете код? =)) Цитата MyNameIsIgor @ А он реализует IA. Но по-разному Потому и нужно приведение типов.лол, интерфейсы для того и нужны, чтоб для совершенно разных классов, но реализующих один интерфейс можно было написать одну функцию и передавать в нее экземпляры классов без приведений, в этом суть интерфейсов Цитата MyNameIsIgor @ недоезыги без множественного наследования в CL есть множественное наследование, но есть и интерфейсы (фактически каждая generic-функция там является интерфейсом), однако ведет он себя как все нормальные языки, а не эта ваша ложка дегтя =) Цитата MyNameIsIgor @ Вернее сказать, не было. Я её предложил. Имею ведь я право предложить задачу? static_cast -- это не ООП-шно =) Цитата MyNameIsIgor @ Что вам не понятно? Просто использование множественного наследования. Мне интересно, как вы сделаете на языках без оного. множественное наследование тут не при чем. статический полиморфизм причем. точнее даже приведение типов |
|
Сообщ.
#2084
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ korvin, то, что интерфейсов в С++ нет говорилось уже неоднократно. Другое дело, что если в языке есть множественное наследование и абстрактные классы, то интерфейсы и не нужны, по крайней мере такие, какие они в C#, Java и Delphi. ты не прочитал вторую цитату: =) Прочитал. Ты мне про гипотетический пример(на который тут уже ответили, повторятся не буду), а я тебе про реальное программирование. Приведи пример полезности интерфейсов в языке со множественным наследованием и абстрактными классами. Добавлено Цитата trainer @ Цитата D_KEY @ можно сказать то, что в нем можно сделать то, чего первоначально не предполагалось.что можно сказать о таком языке, в котором для реализации некоторых вещей просто необходимо прибегать к такому монстрообразному коду... Разве это не справедливо для любого языка? Цитата Ну значит проблема в языке, раз это не получилось сделать таким образом, чтобы код был читаем, расширяем и поиск ошибок не превращался бы в муку. Странно слышать от тебя такой вопрос. Очевидно чтобы перенести максимум работы на стадию компиляции. |
|
Сообщ.
#2085
,
|
|
|
|
Цитата D_KEY @ Прочитал. Ты мне про гипотетический пример(на который тут уже ответили, повторятся не буду), а я тебе про реальное программирование. Приведи пример полезности интерфейсов в языке со множественным наследованием и абстрактными классами. возможность единообразно работать с разными классами, не связанными отношением наследования. вот есть у тебя несколько классов, с разными предками, но с некоторыми методами с одинаковыми сигнатурами, как ты напишешь одну функцию для работы с ними? |