|
|
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
2 Sofwarer в приведенном примере если требуется дефолтная реализация метода, Вам нужен не интерфейс а абстрактный класс, причем не полностью абстрактный, т. е. "заготовка"="полуфабрикат". Интерфейс никак не может быть "полуфабрикатом" - не передергивайте мои слова. формально интерфейс представляет предельный случай абстрактного класса, но практически это не так. На практике области применения интерфейсов и абстрактных классов различаются. Интерфейс представляет собой "спецификацию" класса, необходимую для приведения типов и гарантирующую наличие требуемых методов (java.lang.Runnable) или сигнализирующую что класс удовлетворяет некоторым требованиям (java.io.Serializable), а абстрактный класс представляет собой частичную реализацию - "полуфабрикат", на основе которого легко построить что то новое опираясь на чужой код. с точки зрения програмирования на Java случай полностью абстрактного класса представляется бессмыслицей не имеющей практического значения. Кстати Вы реально используете полностью абстракные классы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 16:02:50 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
2 OU - Вы не видите сути проблемы. Прежде чем опонировать, ответьте на вопрос: "зачем программисту может понадобиться множественное наследование?" На мой взгляд есть два случая когда это может быть нужным: 1. наследование функциональности нескольких родителей. 2. приведение типа к типу любого из родителей. - Вы упорно убеждаете меня в необходимости пункта 2, я согласен с Вашими тезисами по этому пункту и не вижу смысла спорить, тем более в таком тоне. Поверьте, что с наследованием и полиморфизмом в Java я познакомился 9 лет назад из которых 5 лет провел в статусе SCJ2P. Не надо предлагать мне Ваши чудесные книжицы - не куплю. А под "вложенными классами", в данном случае, я понимаю вложенные классы (inner-классы и, с некоторыми ограничениями, nested-классы, являющиеся элементами синтаксиса языка Java начиная с Java 2). Причем тут шаблоны проектирования Decorator и Adapter я не понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 16:25:42 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
Kachalov в приведенном примере если требуется дефолтная реализация метода, Вам нужен не интерфейс а абстрактный класс, причем не полностью абстрактный Я как раз и пытаюсь показать, что граница между этими понятиями надумана. Представьте себе следующую последовательность событий: изначально я реализовал интерфейс с методами getCount и getObject; это интерфейс, не так ли? Затем я добавляю в него getIcon - при этом интерфейс остается интерфейсом - понимаю, что для него была бы удобна дефолтовая реализация - и только из-за этого вроде_бы_концептуальное_понятие "интерфейс" вдруг меняется на нечто другое. Так выходит при Вашем строгом понимании "интерфейса". KachalovИнтерфейс никак не может быть "полуфабрикатом" - не передергивайте мои слова. Я нисколько не пытаюсь передернуть Ваши слова (собственно, я даже не понимаю, как мне можно приписать такую попытку - для этого нужно, чтобы я сослался на Ваше утверждение, чего вроде бы не было). Я апеллирую к Вашему здравому смыслу. Kachalovформально интерфейс представляет предельный случай абстрактного класса, но практически это не так. Вы говорите о той практике, в которой из-за отсутствия множественного наследования других вариантов просто не существует. KachalovИнтерфейс представляет собой "спецификацию" класса, необходимую для приведения типов и гарантирующую наличие требуемых методов (java.lang.Runnable) или сигнализирующую что класс удовлетворяет некоторым требованиям (java.io.Serializable), а абстрактный класс представляет собой частичную реализацию - "полуфабрикат", на основе которого легко построить что то новое опираясь на чужой код. По большому счету (с точностью до формулировок) я с этим согласен. Вопрос не в конкретном синтаксисе, а в предназначении, в применении того или иного класса-интерфейса. Обратите внимание, здесь нет принципиального требования отсутствия реализации в интерфейсе; от того, что мы добавим реализацию getIcon в пример выше, применение MyModel как "спецификации, необходимой для приведения типов и гарантирующей наличие" ничуть не убудет. Собственно, применение останется ровно таким же. Kachalov с точки зрения програмирования на Java случай полностью абстрактного класса представляется бессмыслицей не имеющей практического значения. Безусловно. По той причине, что в этом случае разумнее объявить этот абстрактный класс интерфейсом и не связывать себя ограничениями единонаследия. Kachalov Кстати Вы реально используете полностью абстракные классы? Каждый раз, когда использую интерфейсы :) Если не считать этого, сходу вспоминаю единственный случай, класс TAbstractStep - это "шаг тестирования" в моем автотестере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 17:26:56 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
softwarer Kachalov Кстати Вы реально используете полностью абстракные классы? Каждый раз, когда использую интерфейсы :) - кстати, разница между интерфейсом и классом у которого все методы абстрактные, с точки зрения Java, более существенна. Любой класс является наследником от java.lang.Object, т. е. в отличие от интерфейса обладает рядом не абстрактных методов. softwarerЯ как раз и пытаюсь показать, что граница между этими понятиями надумана. - а я пытаюсь доказать обратное :) Когда Вы создаете интерфейс Вы создаете "спецификацию", когда Вы создаете абстрактный класс Вы делаете "запас на будущее". Мне кажется что разница между "консервами" и "стандартом на консервы" довольно велика (извините за идиотские аналогии, но они, на мой взгляд, хорошо отражают идею). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 17:47:23 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
Kachalov- кстати, разница между интерфейсом и классом у которого все методы абстрактные, с точки зрения Java, более существенна. Любой класс является наследником от java.lang.Object Если помнить об этом, то "полностью абстрактных классов" в Java, как впрочем и в Delphi, вообще не бывает - поскольку методы, унаследованные от Object/TObject, вполне себе конкретные. Но я полагаю, это малосущественная деталь. Kachalov- а я пытаюсь доказать обратное :) Вот и определились :) Теперь следующий шаг - методология доказательства. Я полагаю истинным следующее утверждение: два объекта имеют принципиальное, качественное отличие, тогда и только тогда, когда один из них нельзя мелкими, неконцептуальными изменениями перевести в другой. Если можно - разница между ними количественная, непринципиальная. Таким образом, если вспомнить пример с MyModel и рассмотреть его предполагая наличие в языке множественного наследования, дискуссия упирается в следующий вопрос: добавление реализации getIcon - принципиальное изменение или нет? В принципе, это вопрос вкусов. Я полагаю, что непринципиальное, почему: потому что на самом деле это мелкая техническая деталь, удобная, но не более того; от нее ничего особенного не зависит, в архитектуре решения она просто не видна. Она есть - мы можем написать несколько классов чуть быстрее и чуть качественнее; ее нет - придется скопировать несколько строк кода. Но в том, что касается принципиальных вещей - например, организации взаимодействия объектов в приложении - разницы ровным счетом никакой. KachalovКогда Вы создаете интерфейс Вы создаете "спецификацию", когда Вы создаете абстрактный класс Вы делаете "запас на будущее". Мне кажется что разница между "консервами" и "стандартом на консервы" довольно велика (извините за идиотские аналогии, но они, на мой взгляд, хорошо отражают идею). Я нисколько не против аналогий, сам их активно использую. Данная конкретная представляется мне не совсем верной, не совсем удобной для рассуждений, но не более того (она безусловно образна и хорошо раскрывает Вашу мысль). Если Вы не против, давайте проведем маленький натурный эксперимент. Я показываю кусок кода, а Вы скажите, это "консервы" или "стандарт на консервы", и почему именно: Код: plaintext 1. 2. 3. 4. 5. 6. 7. P.S. Мне действительно интересно, появится ли на этом сайте когда-нибудь качественная подсветка синтаксиса, или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 18:12:00 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
softwarer Я полагаю истинным следующее утверждение: два объекта имеют принципиальное, качественное отличие, тогда и только тогда, когда один из них нельзя мелкими, неконцептуальными изменениями перевести в другой. Если можно - разница между ними количественная, непринципиальная. - из интерфейса класс точно не сделаешь :) а разница все таки принципиальная. Вопрос в том для чего применять ту или иную конструкцию, что то типа вопроса: можно ли микроскопом гвозди забивать - ответ да можно, но это будет не правильно . - извините, но если можно, примерчик на Java, на объектном паскале я писал более 10 лет назад и плохо помню синтаксис, а главное не помню есть ли в нем такое понятие как интерфейсы? Кроме того обсуждение Java-интерфейсов на примере другого языка заведет нас в неведомые дебри :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 19:47:18 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
KachalovКроме того обсуждение Java-интерфейсов на примере другого языка заведет нас в неведомые дебри :) Хм. Я до сих пор полагал, что мы обсуждаем концепцию вообще, а не применительно к Яве. Имхо обсуждать множественное наследование "применительно к Яве" глупо, его здесь просто нет. Kachalov- из интерфейса класс точно не сделаешь Why? Kachalovа разница все таки принципиальная. Где? Если в Java - безусловно. Но представьте язык, где есть множественное наследование; какая принципиальная разница там? Kachalov- извините, но если можно, примерчик на Java Хм. Попробую; проблема в том, что я уже успел подзабыть синтаксис Явы. Будет примерно так: Код: plaintext 1. 2. 3. 4. Kachalov а главное не помню есть ли в нем такое понятие как интерфейсы? Есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 21:24:31 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
softwarer Код: plaintext 1. 2. 3. 4. Не буду мешать :) Скажу лишь, что в Java все параметры передаются по ссылке (за исключением J2EE-бинов, в которых по-умолчанию всё передается по значению). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 21:27:14 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
он жеСкажу лишь, что в Java все параметры передаются по ссылке В смысле, как в Фортране? Странно, если я успел это забыть. Хотя наверное бывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 21:34:25 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
он же softwarer Код: plaintext 1. 2. 3. 4. Не буду мешать :) Скажу лишь, что в Java все параметры передаются по ссылке (за исключением J2EE-бинов, в которых по-умолчанию всё передается по значению). чушь. фсе передается по значению. другое дело, что передаёца. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 21:45:44 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
softwarer В смысле, как в Фортране? Странно, если я успел это забыть. Хотя наверное бывает. Вот уж не знаю, как в Фортране. Передаются по ссылке все кроме примитивных типов (т.е. все объекты), только о String разговор особый - хоть и объект, но неизменяемый и в out его значение не возвращается :) Это я забыл уточнить. А то будут еще обвинять меня в безграмотности и незнании основ, тут такие :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 21:50:20 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
я чушь. фсе передается по значению. другое дело, что передаёца. Фсё - это что? И где? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 21:51:05 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
он жеВот уж не знаю, как в Фортране. Именно что все передается по ссылке. С этим связан классический прикол - можно было сделать примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. и в результате в вызов sub2 параметром передавалась десятка. он жеПередаются по ссылке все кроме примитивных типов Ээ, нет. То, что Вы говорите - это передача по значению. Просто для "непримитивных" типов значением является ссылка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 21:56:41 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
softwarer Ээ, нет. То, что Вы говорите - это передача по значению. Просто для "непримитивных" типов значением является ссылка. Не хочу спорить. Вопрос лишь с какой точки зрения рассматривать. Лично мне привычнее считать, что если я могу изменять переданный объект внутри функции и он изменится снаружи - значит мне передана ссылка на объекте. А если я могу менять его до умопомрачения, но снаружи этого не заметят - значит я получил полную копию объкта (т.е. значение). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 22:03:45 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
"Передана ссылка" - весьма условное понятие в Java, естественно. Просто нужно ж как-то не сойти с ума ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 22:04:33 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
он жеЛично мне привычнее считать, что Я понимаю. Вопрос в том, к каким последствиям это приводит. Если смотреть на ситуацию "как она есть", то достаточно трех концепций: двух общих - "объект есть указатель на объект" и "манипуляции со String приводят к появлению нового String-объекта" - и одной с параметрами - "параметры передаются по значению". Этого достаточно, чтобы понимать все возможные ситуации. У Вас же получилось так, что Вы описали три правила только для параметров: - примитивные типы передаются по значению - непримитивные кроме String передаются вроде как по ссылке - String передается скорее по значению Две общих концепции по-прежнему необходимо помнить, итого пять, да еще помнить, что вторая-третья из частных концепций верны условно. Усложнение на пустом месте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 22:13:26 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
он жеПросто нужно ж как-то не сойти с ума Есть довольно известная и толковая по сути статья . Так вот, выход из этой ситуации - не путаться в сказках, а разбираться в сути. Если угодно, это сишный подход, но он единственно правильный, если не хочется периодически оказываться в ситуации "у меня происходит что-то, что я и понять не могу". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 22:22:34 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
softwarer Есть довольно известная и толковая по сути статья . Спасибо. Интересная статья (в очередной раз благодарен переводчикам вроде тех что на википедии - из-за их безобразий я непрерывно совершенствую свой английский ). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 22:43:07 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
Правда мне пока не приходилось сталкивать с необходимостью деабстрагирования. Но ведь рано или поздно придется, наверное... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 22:43:59 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
softwarerЕсли угодно, это сишный подход, но он единственно правильный, если не хочется периодически оказываться в ситуации "у меня происходит что-то, что я и понять не могу". Ну, хм, бывает :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 23:02:15 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
chroвызывается не то, что Вы думали, а первый попавшийся такой метод (как в Питоне, без сообщения об ошибке). Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 23:12:34 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
LINUXER Kachalovможно унаследовать несколько методов с одинаковой сигнатурой и разной реализацией - возникает коллизия. В интерфейсах также - заимплементишь два интерфейса с одноимёнными полями - всё слетит.А какие у интерфейсов поля? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 23:18:52 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
Partisan Mправильный ответ уже дан - множественное наследование не нужно. А неправильных можно давать сколько угодно. Никакая это не священная война, но достают некоторые с претензией "Почему Java это не C++". Ну и пользуйтесь своим С++ и не приставайте с глупостями. И не надо про "высокую квалификацию" программистов на С++". Я сам долго программировал на C++ (ввиду отсутствия выбора), и с тех пор как перешёл на Java, моя квалификация повысилась (поизучал новые технологии, доступные программистам на Java). Кстати, по моим наблюдениям, большинство программирующих на С++ - дураки, невежды, демократы и психи. Чтобы не быть голословным - один на прямо рабочем месте плевался (фирма Галактика). Я так и не понял, что он хотел этим выразить. Он же, каждый день программируя на VC6, года через 2 после появления VС7, спросил меня, чем оно отличается от VC7. И это не самый тяжёлый случай. О! Первый осмысленный (кроме заглавного) пост в этом топике. Да и заглавный пост тоже глуповат - он порождает обсуждение того, чего нет (имеется в виду java). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 23:22:36 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
А.Грасоff™ О! Первый осмысленный (кроме заглавного) пост в этом топике. Да и заглавный пост тоже глуповат - он порождает обсуждение того, чего нет (имеется в виду java). Это потому что "большинство программирующих на С++ - дураки, невежды, демократы и психи"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 23:29:38 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
он же А.Грасоff™ О! Первый осмысленный (кроме заглавного) пост в этом топике. Да и заглавный пост тоже глуповат - он порождает обсуждение того, чего нет (имеется в виду java). Это потому что "большинство программирующих на С++ - дураки, невежды, демократы и психи"? Нет. Это потому, что "... обсуждение того, чего нет ...". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 23:47:18 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=34071939&tid=2147692]: |
0ms |
get settings: |
13ms |
get forum list: |
20ms |
check forum access: |
9ms |
check topic access: |
9ms |
track hit: |
237ms |
get topic data: |
15ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
| others: | 227ms |
| total: | 601ms |

| 0 / 0 |
