|
|
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
softwarer В этой структуре: 1. Есть очевидное копирование кода между JRadioButton и JRadioMenuItem 2. Отсутствует возможность унифицированно работать с JRadioButton и JRadioMenuItem. А есть необходимость в том, чтобы RadioMenuItem можно быть сопоставить JRadioButton? Почему бы не MenuRadioButton <-RadioButton <- AbstractButton MenuRadioItem (item = RadioButton) <- AbstractMenuItem (private AbstractButton item) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 15:50:30 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
Если хочется с чем-то унифицировано работать (например, установка чекбокса одновременно выставляет и в RadioButton, и в MenuRadioItem) - нужно делать по аналогии с Event'ами в Delphi. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 15:54:21 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
Kachalovможно унаследовать несколько методов с одинаковой сигнатурой и разной реализацией - возникает коллизия. В интерфейсах также - заимплементишь два интерфейса с одноимёнными полями - всё слетит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 16:01:01 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
он жеА есть необходимость в том, чтобы RadioMenuItem можно быть сопоставить JRadioButton? Безусловно. Скажем, я делал систему, в которой функциональные действия описывались классом, допустим, Action, а на уровне настроек интерфейса указывалось, будет ли это RadioAction группой пунктов меню, группой кнопок в тулбаре, еще чем-нибудь. И имхо вполне естественно желание работать со всеми вариантами через единый интерфейс, без кучи case-ов и приведений типов. он жеMenuRadioButton <-RadioButton <- AbstractButton MenuRadioItem (item = RadioButton) <- AbstractMenuItem (private AbstractButton item) В этой схеме у нас получается: 1. Несовместимые Button и MenuItem 2. Куча тупого кода в AbstractMenuItem, публикующего методы AbstractButton 3. Дополнительный код с приведениями типов в MenuRadioItem ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 16:06:19 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
он жеЕсли хочется с чем-то унифицировано работать (например, установка чекбокса одновременно выставляет и в RadioButton, и в MenuRadioItem) - нужно делать по аналогии с Event'ами в Delphi. Во-первых, в Delphi нет никаких Event-ов. Во-вторых, Action-ы в дельфе - вещь безусловно правильная, но дело не в этом. Дельфа тоже не свободна от недостатков single inheritance. В яве пошли по пути дробления на достаточно мелкие функциональные классы; это в принципе правильно, но в условия single inheritance порождает уйму неудобств. Такую библиотеку можно сделать достаточно удобной для использования, но ценой этого будет серьезная дополнительная трудоемкость при ее реализации, в том числе тупое копирование кода. В дельфе пошли по другому пути, то, что я назвал "базовый класс, который умеет все". Это упрощает жизнь, но само по себе не очень-то правильно, поэтому этот путь прошли наполовину; скажем, свойство Caption у Button и MenuItem общее, а вот свойства Checked таки независимы. В принципе, как я уже говорил выше, за счет делегирования интерфейсов в дельфе можно обходиться без множественного наследования легче, чем в других языках. Но все равно я бы предпочел нормальное множественное наследование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 16:13:26 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
[quot softwarer Впрочем, мне будет любопытно услышать более простую модель для следующей структуры: Код: plaintext 1. 2. 3. 4. На практике такой подход порождает уродцев на вроде java.util.Properties. На лицо подмена делигирования наследованием. Смысл в чем: RadioControl - компонента радио, её можно поместить на панель. class RadioMenuItem extends RadioControl, следовательно она тоже должна иметь способность помещатся на панель. Помещаем RadioMenuItem на панель, и рантайм обрыгивается с NPE , потому что RadioMenuItem требует меню! А его у нас и нет. При разумном подходе, мы конечно же обрыгаемся ещё в compiletime. Но это ничего не меняет. RadioMenuItem не есть RadioControl, соответсвенно RadioMenuItem нельзя наследовать от RadioControl! Про RadioButton вообще молчу. Придумайте пример понатуральнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 16:38:02 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
BlazkowiczНа практике такой подход порождает уродцев на вроде java.util.Properties. Признаться, плохо помню этого уродца, бо использовал единственный раз. BlazkowiczНа лицо подмена делигирования наследованием. Может быть и так. К сожалению, с адекватными средствами делегирования в современных языках негусто. BlazkowiczRadioControl - компонента радио, её можно поместить на панель. Ошибаетесь. Я не зря обозвал класс так обще. Это "некий радиоконтрол вообще", без какой-либо специфики. Может быть правильнее было бы назвать AbstractRadioControl, но в Java Abstract-классы имеют чуть другой смысл. Blazkowiczclass RadioMenuItem extends RadioControl, следовательно она тоже должна иметь способность помещатся на панель. Вывод соответственно неверный. BlazkowiczПро RadioButton вообще молчу. Придумайте пример понатуральнее. Ну... как хотите. Если Вы ими не пользуетесь - безусловно, ненатуральные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 16:45:46 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
softwarer BlazkowiczНа практике такой подход порождает уродцев на вроде java.util.Properties. Признаться, плохо помню этого уродца, бо использовал единственный раз. Там методы Hashtable торчат на ружу, чего по логике быть не должно. softwarer BlazkowiczНа лицо подмена делигирования наследованием. Может быть и так. К сожалению, с адекватными средствами делегирования в современных языках негусто. Не понял. softwarer BlazkowiczRadioControl - компонента радио, её можно поместить на панель. Ошибаетесь. Я не зря обозвал класс так обще. Это "некий радиоконтрол вообще", без какой-либо специфики. Может быть правильнее было бы назвать AbstractRadioControl, но в Java Abstract-классы имеют чуть другой смысл. Ааа, теперь понятно softwarer BlazkowiczПро RadioButton вообще молчу. Придумайте пример понатуральнее. Ну... как хотите. Если Вы ими не пользуетесь - безусловно, ненатуральные. Так тут смысл в том что в любой "ограниченой" системе множественное наследование можно применять сколько душе угодно. Проблемы начнутся когда эту систему нужно будет расширить. Тут-то м-наследование и станет поперек колес. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 16:54:08 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
BlazkowiczТам методы Hashtable торчат на ружу, чего по логике быть не должно. Тут скорее вопрос отсутствия приватного наследования. BlazkowiczНе понял. Хм. Давайте так. Напишите, пожалуйста, какой-нибудь простой код с делегированием. Может быть, я соглашусь с тем, что это все хорошо и правильно, а может быть покажу, что именно считаю неадекватным. BlazkowiczТак тут смысл в том что в любой "ограниченой" системе множественное наследование можно применять сколько душе угодно. Проблемы начнутся когда эту систему нужно будет расширить. Тут-то м-наследование и станет поперек колес. Скажу так: я не вижу причин считать это утверждение более верным, нежели строго противоположное, и в топике вроде бы не звучало аргументов в эту сторону. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 17:21:07 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
[quot BlazkowiczТак тут смысл в том что в любой "ограниченой" системе множественное наследование можно применять сколько душе угодно. Проблемы начнутся когда эту систему нужно будет расширить. Тут-то м-наследование и станет поперек колес.[/quot] Причём тут множественное наследование? Проблемы начнутся с расширением любой системы, если это расширение не планировать. Какое наследование в этой системе использовать - это уже дело десятое. Если обратиться к вопросу наследования, то можно выделить порядка 12 типовых случаев, когда может применяться наследования: от различных классификаций объектов (наследование интерфейса) до самого хардкорного конструирования классов (наследование реализации). Не во всех языках имеются механизмы для обеспечения всех возможных типов наследования. Н-р, в java наследование реализованно в таком виде, что наследование properties от hashtable является дуростью. В то время, как истинная дурость заключается в использовании делегирования для решения этой задачи, поскольку создаётся два объекта вместо одного (привет gc и оверхед на вложенные вызовы). Так же как генерики позволяют не писать типизированые варианты коллекций (оставив это удовольствие компилятору), так же в языке с хорошо проработанным механизмом МН не приходится дублировать один и тот же код в объектах определяемых разными наборами однообразных характеристик (в java это вотчина интерфейсов). "Правильное" наследование как минимум включает: - множественно наследование - разрешение "конфликтов" с перекрытием методов по выбору программиста (н-р, что делать если в разных родителях есть методы с одинаковой сигнатурой? - выбрать один из них (какой?) - сохранить оба изменив их имена - сделать один из них private - переопределить один из-них (какой?) и т.д. Выбор должен делать не язык, а программист в зависимости от конкретной ситуации) - закрытое наследование - генерики - ковариантность - переименование методов в наследниках ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 20:01:13 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
правильный ответ уже дан - множественное наследование не нужно. А неправильных можно давать сколько угодно. Никакая это не священная война, но достают некоторые с претензией "Почему Java это не C++". Ну и пользуйтесь своим С++ и не приставайте с глупостями. И не надо про "высокую квалификацию" программистов на С++". Я сам долго программировал на C++ (ввиду отсутствия выбора), и с тех пор как перешёл на Java, моя квалификация повысилась (поизучал новые технологии, доступные программистам на Java). Кстати, по моим наблюдениям, большинство программирующих на С++ - дураки, невежды, демократы и психи. Чтобы не быть голословным - один на прямо рабочем месте плевался (фирма Галактика). Я так и не понял, что он хотел этим выразить. Он же, каждый день программируя на VC6, года через 2 после появления VС7, спросил меня, чем оно отличается от VC7. И это не самый тяжёлый случай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 20:17:02 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
2 Kachalov: автор- использование интерфейсов не является альтернативой множественному наследованию, сходство только визуальное - можно через запятую несколько интерфейсов перечислить. Вы не правильно понимаете роль и предназначение интерфейсов. чего-чего? быстро, обратно к учебникам и будет вам счастье 2 LINUXER: авторВ интерфейсах также - заимплементишь два интерфейса с одноимёнными полями - всё слетит. глупость, ничего не слетит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 20:52:20 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
OUбыстро, обратно к учебникам и будет вам счастье - думаете интерфейсы нужны именно для "кривого" множественного наледования? Боюсь Вы набрались этого из тех самых "учебников". Наверняка в своем коде Вы интерфейсов не используете (только готовые) - я прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 21:54:08 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
что бы не говорили, но древовидная структура самая понятная (как тока ее придумают). Удобна она как для кодировщика, так и для обслуживающего ее в дальнейшем персонала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 22:32:49 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
вот weak form of multiple inheritance (AKA mixin interfaces) на основе интерфейсов. 2 softwarer: ну и где здесь порожденная вашим больным воображением дубликация кода? 2 Kachalov: вы все еще хотите продолжать свой глупый спор о невозможности использования interfaces для эмуляции multiple inheritance? авторБоюсь Вы набрались этого из тех самых "учебников" ага, вам бы читать те учебники что я читал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 22:33:58 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
OUвы все еще хотите продолжать свой глупый спор о невозможности использования interfaces для эмуляции multiple inheritance? - Вы так и не поняли, что речь идет не о том, чтобы с помощью интерфейсов эмулировать множественное наследование о чем уже высказались в предыдущих топиках (Вы своей схемой лишний раз подвердили что получается это необычайно криво). Мне хотелось отметить что Вы пытаетесь использовать интерфейсы не по назначению. У многих авторов (видимо пытающихся перенести опыт программирования C++ на Java) можно встретить тезис о том что интерфейсы в Java предназначены для обхода отсутствия множественного наследования. Зачем разработчикам языка сначала лишать его множественного наследования, а потом через Ж. его обходить интерфейсами? Вдумайтесь в само слово "интерфейс", оцените красоту идеи, и не используйте их ни для чего иного кроме приведения типов. А если Вам необходима функциональность нескольких классов родителей применяйте вложенные классы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2006, 23:35:26 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
автор- Вы так и не поняли, что речь идет не о том, чтобы с помощью интерфейсов эмулировать множественное наследование о чем уже высказались в предыдущих топиках (Вы своей схемой лишний раз подвердили что получается это необычайно криво). чего то вы уважаемый из пальца все высасываете, речь изначально шла о возможности/невозможности имплементации multiple inheritance в java. Ваша оригинальная реплика была о том что интерфейсы это не альтернатива multiple inheritance. Я вам привел конкретный пример, что еще надо то? авторМне хотелось отметить что Вы пытаетесь использовать интерфейсы не по назначению. У многих авторов (видимо пытающихся перенести опыт программирования C++ на Java) можно встретить тезис о том что интерфейсы в Java предназначены для обхода отсутствия множественного наследования. А кто и где говорил о том что интерфейсы нужны исключительно для эмуляции multiple inheritance? Если видели, приведите пример, если нет, то нечего изобретать тогда. авторВдумайтесь в само слово "интерфейс", оцените красоту идеи, и не используйте их ни для чего иного кроме приведения типов. А если Вам необходима функциональность нескольких классов родителей применяйте вложенные классы. вы разберитесь с понятием наследования и полиморфизма, потому как предлагаемый вами пример будет работать только там где предполагается определенный тип или его сабклассы. В то время как использование наследованных интерфейсов позволяет использовать их вместо базовых при этом сами интерфейсы могут быть имплентированы любыми классами. Это в том числе о красоте идеи... В остальном присоеденяюсь к мнению Partisan M ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 00:17:12 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
2 OU Kachalov OUдостижение эффекта multiple inheritance через использование interface всетаки достаточно эффективный, безопасный и элегантный подход. - использование интерфейсов не является альтернативой множественному наследованию, сходство только визуальное - можно через запятую несколько интерфейсов перечислить. Вы не правильно понимаете роль и предназначение интерфейсов. - не хочется собачится, возможно я резковато высказался, - приношу свои извинения за тон, но мне не кажется что для реализации множественного наследования (вопрос нужно ли множественное наследование предлагаю не трогать вообще, так это личное дело каждого программиста, мне например, не нужно) надо (заметьте не можно, а надо) использовать интерфейсы. Т. к. использование интерфейсов приводит в данной задаче к громозкому коду (не элегантному, не эффективному), в частности в приведенной OU схеме мы видим 3 класса и 3 интерфейса (хотя Child лишний), итого 5-6 файлов - это что элегантный и эффективный код? По безопасности тоже може проехаться - из Вашей схемы не очевидна реализация методов наследника, т. е. не факт, что методы наследника имеющие ту же сигнатуру, что и методы родителей, имеют то же тело, иначе говоря есть хороший повод накосячить. Более того в Вашем случае они точно будут иметь другое тело и лишь имитировать функционал родителей, т. е. возможно от тупого переписывания методов Вы избавились, но это множественным наследованием не назовешь. Прежде чем городить такой код желательно выяснить зачем Вам множественное наследование (МН)? Если МН Вам необходимо для получения функциональности нескольких родителей, мне кажется, заметно проще использовать вложеные классы (этот тезис Вы упорно игнорируете). Случай когда Ваша схема необходима - случай приведения типов, где наследник должен приводиться к типам нескольких родителей, а если разобраться по существу: класс Softwarer и SoftwarersMother реализуют один и тот же интерфейс Mother, но при этом Softwares никак не связан с SoftwarersMother, т. е. SoftwarersMother не является родителем для Softwarer, аналогично с веткой Father. Если избавится от шелухи Ваша диаграма выглядит так: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 11:21:44 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
OU2 softwarer: ну и где здесь порожденная вашим больным воображением дубликация кода? Попробуйте вылечить свои больные глаза и обращаясь ко мне, говорить о том, о чем говорил я. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 13:16:04 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
KachalovВдумайтесь в само слово "интерфейс", оцените красоту идеи Может быть, я не понимаю красоту идеи. Для меня интерфейс - это pure abstract класс, не более того. Соответственно, частный случай более общего решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 13:18:27 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
softwarerинтерфейс - это pure abstract класс, не более того. Соответственно, частный случай более общего решения. - формально Вы правы, но роль интерфейса при написании кода существенно отличается от роли абстрактного класса. Абстрактный класс, грубо говоря, представляет собой "полуфабрикат", заготовку довести "до ума" которую должен программист при реализации конкретной задачи, а интерфейс выполняет роль "спецификации" гарантирующей что в реализующем ее классе будет необходимый набор методов. Что бы меня потом не тыкали носом в книжки сразу скажу, что это мое личное мнение на использование абстрактных классов и интерфейсов, возникающее из собственного опыта. Мнение которое никому не навязываю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 13:37:05 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
2 kachalov: авторЕсли МН Вам необходимо для получения функциональности нескольких родителей, мне кажется, заметно проще использовать вложеные классы (этот тезис Вы упорно игнорируете). еще раз повторю, вы не понимаете таких вещей как наследование и полиморфизм. На пальцах, множественное наследование: Класс С наследован от А и В. Соответсвенно класс С может быть использован вместо класса А или В. Имитация множественного наследования с помощью интерфейсов: Интерфейс С наследован от интерфейсов А и В. Соответственно интерфейс С и его имплементации могут быть использованы вместо интерфейса А или В. ***Вместо интерфейса С можно использовать класс который будет имплементировать интерфейсы А и В, но в таком случае каждый раз когда вы захотите получить класс который можно использовать вместо А или В вы должны будете либо постоянно дублировать имплементацию двух интерфейсов (т.е в каждом случае писать class X implements A, implements B ) либо наследовать от класса С (это менее полиморфично по сравнению с возможностью использования любого класса имплементирующего данный интерфейс). Вариант предложеный вами, который основан либо на Decorator либо на Adaptor design patterns (это я понимаю то что вы имеете в виду под использованием вложенных классов) Класс С наследуется от А или Б и инкапсулирует экземпляры классов А и В. В данном случае класс С может быть использован только ВМЕСТО А ИЛИ В (т.е своего супер класса), но никак ни ОБОИХ . Так что множественным наследованием здесь и не пахнет. 2 softwarer: авторНе достигает эффекта и приводит к тупому копированию кода в каждый класс, реализующий эти интерфейсы. провал памяти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 15:11:24 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
Kachalovно роль интерфейса при написании кода существенно отличается от роли абстрактного класса. Не соглашусь. Мне кажется, сказанное Вами - поверхностное видение, но если копнуть, оказывается что оба названных предназначения на самом деле одно и тоже. KachalovАбстрактный класс, грубо говоря, представляет собой "полуфабрикат", заготовку Прежде всего, давайте оговорим различие между abstract class и pure abstract class. Первый - действительно полуфабрикат; второй - скорее сырье, или как Вы назвали, заготовка. Далее. Ваша точка зрения, как мне представляется, неявно ориентируется на концепцию single inheritance - абстрактный класс для Вас это нечто, от чего Вы наследуетесь, а интерфейс - то, что реализуете. То есть разница, о которой Вы говорите, опирается на ограничения языка. Если взять инструмент с multiple inheritance, разница сводится до технической, более того, необнаруживаемой. Как пример этого - однажды мне потребовался интерфейс некоей модели. Давайте его условно опишем так (будем надеяться, я еще не забыл синтаксис явы): Код: plaintext 1. 2. 3. 4. так вот, в этой модели мне бы вполне пригодился следующий метод, как дефолтовая реализация для всех моделей: Код: plaintext 1. 2. 3. Но от такой потребности "интерфейс" ничуть не становится "полуфабрикатом" - согласны? Итого, мое мнение: "интерфейс" - это один из вариантов применения классов. Фактически разница такова: если классу А по смыслу необходимо наследоваться от класса Б, то это "родительский класс"; если класс А легко может реализовать требования класса Б, но и без него ничего особого не потеряет, то это "интерфейс". Итого, получаем, что интерфейсы в явовском смысле - это вырожденный случай abstract class, тот самый pure abstract class. Для полноты картины - я иногда пользовался еще и вырожденными интерфейсами, то есть интерфейсами, не содержащими методов. Фактически этот интерфейс использовался просто как логический признак на соответствующем объекте, скажем, интерфейс ThreadedAction показывал, что Action может и должен запускаться в отдельном потоке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 15:24:13 |
|
||
|
Множественное наследование
|
|||
|---|---|---|---|
|
#18+
OU2 softwarer: авторНе достигает эффекта и приводит к тупому копированию кода в каждый класс, реализующий эти интерфейсы. провал памяти? Ничуть. Ваше выборочное цитирование меня не смущает и не обязывает; вылечите свои больные глаза, прочитайте то, что написано чуть выше, чем выхваченная Вами строка и покажите не один маленький пример, в который мне даже лень смотреть - может и в нем есть это тупое копирование - а полноценную библиотеку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2006, 15:28:21 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=34071688&tid=2147692]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
221ms |
get topic data: |
9ms |
get forum data: |
7ms |
get page messages: |
157ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 660ms |

| 0 / 0 |
