Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 140 141 [142] 143 144 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#2116
,
|
|
|
|
Цитата Qraizer @ А вот второе - категорическое нет. Это методы разных интерфейсов. С какого перепуга они окажутся одним и тем же? Имена совпали? Бывает. Кто виноват? В обоих ситуациях можно считать Программиста (хоть мне тоже не нравится молчание компилятора при совпадении имён, но тут иначе только хуже): а) На начальном проектирования не позаботился о именовании методов у классов, позиционируемых как "множествено-наследуемые". б) Выбрал классы изначально не позиционируемые как "множествено-наследуемые". Цитата Qraizer @ Зато Shaggy лишён возможности наследовать готовые реализации ITCP и IHistory, написанные с год назад для разных проектов. Вот объединить бы оба плюса в одни Плюсы... Можно путём агрегации, будет выглядеть примерно так: ![]() ![]() MultiClass.TCP.LifeTime; MultiClass.History.LifeTime; Но зато никаких коллизий. Но не в этом случае, компилятор выдаст предупреждение о сокрытии виртуального метода из базового класса. Цитата Qraizer @ DesweR, как обычно, ничего не понял, но вставил. Речь шла о том, что при передаче в функцию, ожидающую интерфейс A, и получая в ней поведение интерфейса B - это только в Delphi и C# считается за +. Интересно посмотреть на счастливого программера, меняющего время жизни TCP-пакета и получающего вместо этого смену длины истории диалога. А ты читай внимательнее, т.к. в Delphi и C# интерфейсы реализацию не несут - обрати своё внимание на классы реализующие эти интерфейсы, а именно на переопределённый метод f класса B, унаследованного от базового A. И не надо нам потом рассказывать о "счастливых" программистах С++ Цитата Qraizer @ Я-таки вижу в Дельфийном коде AS? Или мне мерещится? ...Ах да, он же не работает, тьфу ты... работает как и должен работать в Дельфи, угу. Да он собственно там и не нужен (пардон за мой копипаст), класс B и так включает реализацию IA. Цитата Qraizer @ Если кто не понял. А то как слепые, такое ощущение. static_cast<> там играет роль селектора реализаций интерфейса A. Если уж горе-дизайнер надизайнил такую иерархию, что бедному Повстанцу теперь за ним разгребать, то выбор требуемой одной из двух копий реализации A выполняется одним чихом. "А у вас?" Больше походит на хак, прямой вызов метода предка, переопределённого в потомке. Добавлено Цитата MyNameIsIgor @ Да я вообще в осадок выпал... Вот что сказать человеку, утверждающему, что небо красное? ![]() Привидение потомка к предку и предка к потомку - две большие разницы. Слава Богу, хоть что-то поняли... Только сначала я просил как раз иное поведение. И уже после того, как korvin привёл код, который по моим представления им не обладал (что вы и подтвердили), я спросил, как же тогда будет выглядеть код с переопределение метода класса A в B. Ты юродствуешь или в самом деле не понимаешь? |
|
Сообщ.
#2117
,
|
|
|
|
Цитата DesweR @ Ты юродствуешь или в самом не понимаешь? Это вы не изволите понимать наличие двух реализаций интерфейса IA в одном классе. |
|
Сообщ.
#2118
,
|
|
|
|
Цитата MyNameIsIgor @ Слава Богу, хоть что-то поняли... Только сначала я просил как раз иное поведение. И уже после того, как korvin привёл код, который по моим представления им не обладал (что вы и подтвердили), я спросил, как же тогда будет выглядеть код с переопределение метода класса A в B. Мда, это так "ООПшно" Добавлено Цитата MyNameIsIgor @ Это вы не изволите понимать наличие двух реализаций интерфейса IA в одном классе. Гмм... что? |
|
Сообщ.
#2119
,
|
|
|
|
Цитата DesweR @ Мда, это так "ООПшно" Это теперь мантра такая? korvin - законодатель мод? Цитата DesweR @ Гмм... что? Вот и я говорю: вы не понимаете. |
|
Сообщ.
#2120
,
|
|
|
|
Цитата MyNameIsIgor @ Вот и я говорю: вы не понимаете. А мне кажется это вы не понимаете, точнее вы изначально не так поняли поставленную задачу Корвином, исказив её в своём варианте. |
|
Сообщ.
#2121
,
|
|
|
|
Цитата DesweR @ А мне кажется это вы не понимаете, точнее вы изначально не так поняли поставленную задачу Корвином Я понял изначальную задачу. И я её решил. Как и Повстанець. Цитата DesweR @ исказив её в своём варианте Я её не исказил, а предложил новую задачу на основе имеющейся. Кстати, решения так и не увидел |
|
Сообщ.
#2122
,
|
|
|
|
Цитата MyNameIsIgor @ Я понял изначальную задачу. И я её решил. Как и Повстанець. Ну да ладно, по своему так по своему решили. Цитата MyNameIsIgor @ Я её не исказил, а предложил новую задачу на основе имеющейся. Кстати, решения так и не увидел Это? Цитата DesweR @ вызов метода предка, переопределённого в потомке. Добавлено Цитата D_KEY @ DesweR, внимательнее нужно читать и меня тоже. Модули, безусловно, нужны, речь о том, что является модулями в ООП системе. Если ты еще не понял, то Мейер считает, что классы. Мейер не просто считает, что классы, а выводит серию критериев, принципов и правил, которым должна соответствовать модульность, собственно класс для него - это средство достижения цели (собственно ему так и проще, Eiffel - чистый ОО язык). Справедливости ради, я хотел бы провести сравнение - насколько модульность в C++ и Delphi в своём виде соответствует представлениям Мейера, но всё времени не хватает хотя бы на ознакомление с Eiffel. Добавлено К слову спросить, а в C# есть ли дизайн классов по контракту? В Oxygene (Delphi Prism) есть http://prismwiki.codegear.com/en/Class_Contracts |
|
Сообщ.
#2123
,
|
|
|
|
Цитата DesweR @ Это? Прочитайте тему. |
|
Сообщ.
#2124
,
|
|
|
|
|
Сообщ.
#2125
,
|
|
|
|
Это.
|
|
Сообщ.
#2126
,
|
|
|
|
Едем дальше, требуется чтобы на этом моменте:
![]() ![]() f1(static_cast<A&>(b)); получилось это: ![]() ![]() A::f() Верно? Добавлено Метод класса В ![]() ![]() virtual void IB_f() { std::cout << "B::f()" << std::endl; } это фактически перекрытый метод класса А ![]() ![]() virtual void f() { std::cout << "A::f()" << std::endl; } Так? Добавлено Если всё верно, тогда зачем эти методы делать виртуальными? |
|
Сообщ.
#2127
,
|
|
|
|
Цитата DesweR @ Едем дальше, требуется чтобы на этом моменте: ![]() ![]() f1(static_cast<A&>(b)); получилось это: ![]() ![]() A::f() Верно? Добавлено Метод класса В ![]() ![]() virtual void IB_f() { std::cout << "B::f()" << std::endl; } это фактически перекрытый метод класса А ![]() ![]() virtual void f() { std::cout << "A::f()" << std::endl; } Так? Нет, не верно. Метод A::f - отдельно, метод B::IB_f - отдельно. |
|
Сообщ.
#2128
,
|
|
|
|
MyNameIsIgor
А что у тебя выведется при таком варианте? ![]() ![]() var a: A; b: B; begin a := A.Create; a.f; b := B.Create; b.f; a := B.Create; a.f; end; |
|
Сообщ.
#2129
,
|
|
|
|
Цитата DesweR @ Цитата D_KEY @ DesweR, внимательнее нужно читать и меня тоже. Модули, безусловно, нужны, речь о том, что является модулями в ООП системе. Если ты еще не понял, то Мейер считает, что классы. Мейер не просто считает, что классы, а выводит серию критериев, принципов и правил, которым должна соответствовать модульность, собственно класс для него - это средство достижения цели (собственно ему так и проще, Eiffel - чистый ОО язык). Справедливости ради, я хотел бы провести сравнение - насколько модульность в C++ и Delphi в своём виде соответствует представлениям Мейера, но всё времени не хватает хотя бы на ознакомление с Eiffel. Если рассматривать классы, то С++ удовлетворяет критериям. А отдельного понятия "модуль" в С++ нет |
|
Сообщ.
#2130
,
|
|
|
|
Цитата korvin @ 2) совпадают полностью сигнатуры -- никакой колизии, просто один и тот же метод, в чем проблема? пересечение множеств всего-навсего ... т.е. это не является коллизией в общем-то. хотя как именно ведет себя C# и Delphi в таких ситуациях, я не знаю, сужу по Java/Go/Racket В C# это не так. При реализации придётся явно указать, от какого интерфейса взят метод. ![]() ![]() void InterfaceName.MethodName(int a) {...} |