Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 306 307 [308] 309 310 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#4606
,
|
|
|
|
Цитата scorpion @ Вы показали не концептуальные различия, вы показали конкретную фичу, конкретного яп Нет. Так ведут себя все языки, где есть интерфейсы. Цитата и утверждаете, что без этой фичи, абстрактные классы не могут ни при каких обстоятельствах являться интерфейсами. Все зависит от того, что вы понимаете под интерфейсами Мне кажется, что вы не очень понимаете текущий контекст данного обсуждения Цитата Они связаны с концепцией интерфейсов в терминологии тех языков, где интерфейсы выделены в отдельную сущность. Всякие же плюшки, приведеные вами ранее, никак не связаны с концепцией интерфейсов. Добавлено Цитата scorpion @ Смысл фразы состоит в том, что в С++, с помощью абстрактных классов, я могу сделать некую сущность, которая будет удовлетворять концепции интерфейсов. В вашем ее понимании Добавлено Вообще-то это уже роль абстрактного класса |
|
Сообщ.
#4607
,
|
|
|
|
Понимаешь, в чем соль, в шарпе все что там написано, возлагается либо на абстрактные классы, либо на интерфейсы. В С++ весь этот блок относится к абстрактным классам. Т.е. смесь этого всего в одну сущность. Добавлено Цитата D_KEY @ Нет. Так ведут себя все языки, где есть интерфейсы. Конкретно какие и как именно себя ведут? ты имеешь ввиду пример флекса? Цитата D_KEY @ Все зависит от того, что вы понимаете под интерфейсами Некую сущность, которая предоставляет пользователю некую абстракцию, которая реализуется множеством классов, и может иметь разные реализации. Что то типо того. Цитата D_KEY @ Они связаны с концепцией интерфейсов в терминологии тех языков, где интерфейсы выделены в отдельную сущность. Вот именно что в терминологии тех языков, а не в концепции в целом. Цитата D_KEY @ В вашем ее понимании А в вашем, нет? |
|
Сообщ.
#4608
,
|
|
|
|
Цитата scorpion @ Некую сущность, которая предоставляет пользователю некую абстракцию, которая реализуется множеством классов, и может иметь разные реализации. Что то типо того. Тогда да, абстрактные классы подходят. Именно поэтому я и говорю о том, что в языках с множественным наследованием интерфейсы не нужны |
|
Сообщ.
#4609
,
|
|
|
|
|
Сообщ.
#4610
,
|
|
|
|
Цитата Romkin @ Видит. И как правило видит он объявление класса. Где гарантия, что подразумевался именно этот интерфейс? как это где? в объявлении класса. и как правило видит он сигнатуру класса, со всеми методами, которые он реализует. а гарантии, что именно этот интерфейс, дают пространства имен, будь то имя пакета или имя интерфейса. Добавлено Цитата MyNameIsIgor @ Не вижу никакого смысла в таких интерфейсах, ибо в рамках одного пакета можно и явно декларировать реализацию двух интерфейсов. а если у нас несколько разных пакетов? мы уже обсуждали это с Qraizer'ом. в одном пакете/интерфейсе один программист определил некий метод, в другом пакете/интерфейсе другой программист определил метод с такой же сигнатурой (но "с другим смыслом"), нам в третьем пакете хочется реализовать оба метода/интерфейса. как поступить, если у нас вообще нет пространств имен? Добавлено это указывается в имени интерфейса/пакета и документации к нему, при чем тут явное декларирование реализации интерфейса классом? |
|
Сообщ.
#4611
,
|
|
|
|
Цитата korvin @ а если у нас несколько разных пакетов? мы уже обсуждали это с Qraizer'ом. в одном пакете/интерфейсе один программист определил некий метод, в другом пакете/интерфейсе другой программист определил метод с такой же сигнатурой (но "с другим смыслом"), нам в третьем пакете хочется реализовать оба метода/интерфейса. как поступить, если у нас вообще нет пространств имен? При чём тут вообще это? Почему интерфейс и пакет через дробь? Это взаимозаменяемые понятия что ли? Я говорил про утиную типизацию применительно к интерфейсам как говорил D_KEY. И я не вижу в ней смысл в рамках одного модуля, потому что в нём как раз можно и явно декларировать реализацию. Она могла бы пригодиться как раз в том случае, если мы получили модуль, который не можем изменить, и используем из него класс как реализующий интерфейс из совсем другого модуля. Но опять же это выглядит нехорошо, да и можно как говорил Romkin сделать наследника. |
|
Сообщ.
#4612
,
|
|
|
|
Цитата korvin @ а гарантии, что именно этот интерфейс, дают пространства имен, будь то имя пакета или имя интерфейса. Вот фактически я сейчас и сообразил, пространство имен и дает ассоциацию. С тем же успехом можно и явно ассоциировать интерфейс с классом, разницы особой я не вижу. Точнее разница есть: если ассоциировать с классом, то можно и в другом пространстве имен эту ассоциацию использовать. |
|
Сообщ.
#4613
,
|
|
|
|
и что, везде, где нам нужно, оборачивать каждый объект в обертку? чем это удобней, чем возможность реализовать интерфейс отдельно от класса?
|
|
Сообщ.
#4614
,
|
|
|
|
Цитата korvin @ и что, везде, где нам нужно, оборачивать каждый объект в обертку? чем это удобней, чем возможность реализовать интерфейс отдельно от класса? Удобством мне такой вариант и нравится. Практически всё выглядит хорошо. Тот факт, что реализующий класс не знает в качестве чего его будут использовать, мне не нравится. Вот почему в джавошарпе пошли по пути явной декларации реализации интерфейса? |
|
Сообщ.
#4615
,
|
|
|
|
Цитата Flex Ferrum @ Конечно. Я ж написал "подобное поведение", а не "такое же поведение". Нюансы есть, однако главная задача - автоматическая сборка всех абстрактных методов в одном потомке - решается.Виртуальное наследование - совсем не то же самое. И применять его надо с большой осторожностью, хорошо понимая, к чему это приведёт. Это тебя с Romkin-ым понесло в нечто другое, а именно - интерфейсы, мол, нет множественного наследования реализаций. Когда обсуждали множественное наследование, ты сам приставал к дельфистам с вопросом "ну а что если вдруг нужны две разные реализации одного интерфейса", как и я привёл пример с разными сокетами (правда реализация тут одна, но всё равно два объекта) на что тебе (или мне, или это другой вопрос был) было продемонстрирована агрегация с делегацией. Поскольку при необходимости агрегация может накостылить множественность наследования (ты ж тогда ещё добил "зачем тогда наследование вообще, если агрегация с тем же успехом может заменить и простое наследлование"), я и спросил то, что спросил. Об интерфейсах не я заикнулся, и мне непонятно, зачем вы холиварите, если спустя чуток времени уже ничего не помните. Зачем мне это делать, если достаточно вас почитать. Добавлено Цитата Flex Ferrum @ Ты не прав в постановке задачи. Одноимённость перекрытых методов не означает реализацию интерфейса.Тогда перепиши на C++ пример из этого поста: Delphi vs C++ vs C# (сообщение #3016643) , только без введения новых линий наследования. ![]() ![]() interface IStack { push(); pop(); getTop(); isEmtry(); } class MDIWindowContainer { push(); pop(); get(); isEmtry(); } |
|
Сообщ.
#4616
,
|
|
|
|
Цитата MyNameIsIgor @ Удобством мне такой вариант и нравится. Практически всё выглядит хорошо. Тот факт, что реализующий класс не знает в качестве чего его будут использовать, мне не нравится. Вот почему а джавошарпе пошли по пути явной декларации реализации интерфейса? в каком смысле не знает? он реализует себе свой собственный интерфейс (и возможно какие-то другие, которые посчитает нужным), а кто-то другой возьмет и добавит реализацию еще какого-нибудь интерфейса, если ему нужно. собственно в некотором смысле это наследование и есть, только без введения собственно нового класса. опять же это не отменяет возможность явной декларации, просто помимо тех интерфейсов, что указаны в декларации класса, можно отдельно реализовать интерфейс другого класса. ну что-то типа ![]() ![]() package x; class A implements y.I, y.J { // ... } ![]() ![]() package z; import x.A; interface K { // ... } implement K for A { // ... } почему в джавошарпе такого не сделали -- не знаю, вот в CLOS, Go и Haskell сделали. |
|
Сообщ.
#4617
,
|
|
|
|
Цитата Qraizer @ Не D_KEY ли korvin-у доказывал, что совпедание сигнатур методов ни о чём не говорит? Не, это я делал с большой пеной у рта. Когда доказывал D_KEY'ю, что утиная типизация для интерфейсов - плохо |
|
Сообщ.
#4618
,
|
|
|
|
Меня походу вообще не читают. Ромб в наследовании - это не проблема программиста. Задачей архитектора является указать, что делать с одинаковыми аттрибутами и как делать. Задача. Он знает, нужно ли совмещение или разделение. И лично я большей частью в C++ использую разделение, т.к. гораздо чаще востребовано дизайном. Не существует проблемы ромба в множественном наследовании реализаций, существует проблема реализации архитектуры, выданной архитектором системы, средствами выбранного языка програмирования.
Добавлено Не, ты был закидан не за это. Тебя не так поняли и решили, мол, это так и надо. Это один из вариантов - вон, Flex Ferrum-а тоже на неё тянет - почему бы и нет. Но - гораздо менее надёжный, нежели предвартельное предоставление контракта, ибо чревато случаностями, недетектируемыми или непонятно детектируемыми на ранних стадиях. Когда нет другого варианта - насколько я помню, шёл разговор о статическом полиморфизме - это вполне вариант. |
|
Сообщ.
#4619
,
|
|
|
|
Цитата Qraizer @ Зачем мне это делать, если достаточно вас почитать. Т.е. я "апологет других языков"? Вообще-то, мне больше нравится множественное наследование + абстрактные классы, чем подход Java/Delphi/C#. Я просто пояснял концепцию интерфейсов. Цитата Ты не прав в постановке задачи. Одноимённость перекрытых методов не означает реализацию интерфейса. ![]() ![]() interface IStack { push(); pop(); getTop(); isEmtry(); } class MDIWindowContainer { push(); pop(); get(); isEmtry(); } Т.е. ты видишь что-то плохое в коде: ![]() ![]() interface IStack { push(); pop(); getTop(); isEmtry(); } class MDIWindowContainer { push(); pop(); get(); isEmtry(); } class MyClass : MDIWindowContainer, IStack { // ... } Интересно что? Ведь разработчик MyClass наверно знает, что делает, правда? Добавлено Цитата Qraizer @ Но - гораздо менее надёжный, нежели предвартельное предоставление контракта, ибо чревато случаностями, недетектируемыми или непонятно детектируемыми на ранних стадиях. И как же живут бедные люди, пишущие системы на языках с динамической типизацией ?! |
|
Сообщ.
#4620
,
|
|
|
|
Цитата Qraizer @ Меня походу вообще не читают. Ромб в наследовании - это не проблема программиста. Задачей архитектора является указать, что делать с одинаковыми аттрибутами и как делать. Задача. Он знает, нужно ли совмещение или разделение. И лично я большей частью в C++ использую разделение, т.к. гораздо чаще востребовано дизайном. Не существует проблемы ромба в множественном наследовании реализаций, существует проблема реализации архитектуры, выданной архитектором системы, средствами выбранного языка програмирования. У интерфейса нет атрибутов, там только методы. ТАк или иначе. Не ты ли меня допрашивал насчет ромба? Добавлено Цитата Qraizer @ Когда обсуждали множественное наследование, ты сам приставал к дельфистам с вопросом "ну а что если вдруг нужны две разные реализации одного интерфейса", как и я привёл пример с разными сокетами (правда реализация тут одна, но всё равно два объекта) на что тебе (или мне, или это другой вопрос был) было продемонстрирована агрегация с делегацией. Это было давно и неправда. Но динамическое "наследование" интерфейсов я и сейчас могу продемонстрировать, к вопросу отличия от абстрактных предков. |