LINUX.ORG.RU

зачем нужны примеси, если есть множественное наследование?

 , ,


0

3

Я встретил такое мнение (см. табличку в конце) : в Скале пытались уйти от проблемы ромба примесями, но примеси сами по себе могут образовывать ромб, поэтому ромб примесей в Скале административно запрещён. Выглядит, как будто сначала плохо подумали, а потом поставили заплату. Или я что-то не понял в жизни?

Иными словами, тогда зачем вообще примеси? Множественное наследование и композиция. Запрети ромб в множественном наследовании и получишь всё, что могут примеси, не вводя их отдельно. Пусть будут просто классами.

★★★★★

Ответ на: комментарий от anonymous

А ты зачем-то пытаешься поместить ребенка во множество его родителей.

Это было бы так, если бы оба родителя были бы абстрактными сущностями, которые не могут существовать сами по себе в принципе :-)

Это не «было бы», это так и есть - ты пытаешься. Естественно, в результате у тебя получается унылое месиво.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Если ты о том, что Вася может в определенный момент в рантайме перестать стать футболистом, то для динамических ООП-языков тут проблем нет, можно и «отнаследовать», в смысле, выкинуть из наследия класс в любой момент

linearisation
()
Ответ на: комментарий от tailgunner

Это не «было бы», это так и есть - ты пытаешься.

Добро пожаловать в реальность :-)

Естественно, в результате у тебя получается унылое месиво.

Причём тут я? :-)

anonymous
()
Ответ на: комментарий от anonymous

Нет, начался активный поиск общности, как то велел делать тот же Страуструп :-)

Искать общность - это прекрасно. Но ты нашел общность, а думаешь, что нашел базовый класс.

tailgunner ★★★★★
()
Ответ на: комментарий от linearisation

В чем проблема изменяемости(для нормальных ООП языков)? В чем конкретно проблема? Приведи пример, пожалуйста

Проблема в том, что ты очевидно понимаешь под «нормальными ООП-языками» только языки с динамической типизацией.

anonymous
()
Ответ на: комментарий от anonymous

Father и Mother это Human и имеют общую часть реализаци

Пример не в тему. Я не являюсь ни мамой, ни папой. Кажется, что это мелочь, а если вдуматься, то это не мелочь уже.

den73 ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

Но ты нашел общность, а думаешь, что нашел базовый класс.

Не думаю, а знаю :-) Общность в ООП выражается только с помощью родительского класса :-)

anonymous
()
Ответ на: комментарий от den73

Я не являюсь ни мамой, ни папой. Кажется, что это мелочь, а если вдуматься, то это не мелочь уже.

Вот что надо делать, а не какие-то там кул-язычки :-)

anonymous
()
Ответ на: комментарий от anonymous

Да, термин «ООП» принадлежит Алану Кею, он имел в виду именно динамические языки, статику он не рассматривал, ее позже за уши притянули. Естественно, статика концепцию нормально реализовать не может

linearisation
()
Ответ на: комментарий от Zenom

но примеси сами по себе могут образовывать ромб

Не могут

Разберусь - напишу. Во всяком случае, раз есть линеаризация в Скале, то нет дыма без огня.

den73 ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Но ты нашел общность, а думаешь, что нашел базовый класс.

Не думаю, а знаю :-)

Думаешь, что знаешь.

Общность в ООП выражается только с помощью родительского класса :-)

Только? Да ты реально болен.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Думаешь, что знаешь.

Знаю, что знаю :-)

Только? Да ты реально болен.

А кто реально здоров? :-) Ты что-ли? :-)

anonymous
()
Ответ на: комментарий от den73

Пример не в тему. Я не являюсь ни мамой, ни папой. Кажется, что это мелочь, а если вдуматься, то это не мелочь уже.

А в чем проблема то? наследуй от Human JustHuman и будешь не-мамой-не-папой

linearisation
()
Ответ на: комментарий от linearisation

А в чем проблема то? наследуй от Human JustHuman и будешь не-мамой-не-папой

А если от Android JustAndroid? :-)

anonymous
()
Ответ на: комментарий от anonymous

От ситуации. Я, собственно, не вижу проблем наследовать его объект непосредственно от самого Человека, этот JustHuman может быть и лишним, хз, что у него там за случай.

Короче, вот пример.

Допустим, имеем классы Человек, Мама, Папа, Ребенок.

Как концептуально правильно надо тут выстроить иерархию? На мой вхгляд так: Ребенок наследуем от Человек Мама Папа. Мама и Папа — от Человек.

Наследовать ребенка нужно от человека в первую очередь, потому что Мама может быть инвалидом, у неее одна рука, ребенок же должен иметь 2. Ни мама ни папа не должны затирать в ребенке ничто человеческое в общем случае.

А путаются в 2-х соснах:)

linearisation
()
Ответ на: комментарий от den73

Пишут, что это связано с default methods. Как это именно сделано - мне не слишком интересно.

Default methods allow an author of an API to add new methods to an interface without breaking the old code using it. Although it was not their primary intent, default methods also allow multiple inheritance of behavior (but not state).

den73 ★★★★★
() автор топика
Ответ на: комментарий от nezamudich

Не совсем понял, причем тут материалистическая диалектика. И почему именно материалистическая, а не идеалистическая?

linearisation
()
Ответ на: комментарий от unt1tled

Не знаю, честно сказать. Я прочитал об этом в рекламе Скала, где авторы радостно тыкали пальцами в эту фичу. Как конкретно оно выглядит в коде, я не вижу. Насколько я понимаю, нужно как-то косвенно это выразить. До твоего вопроса я даже не пытался это выяснить, т.к. Ява мне не слишком интересна вообще.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 2)
Ответ на: комментарий от anonymous

Чтобы обойти это в восьмой жабе сделали интерфейсы с реализацией.

Т.е. diamond problem снова с нами ;)

grim ★★☆☆
()
Ответ на: комментарий от linearisation

Как концептуально правильно надо тут выстроить иерархию? На мой вхгляд так: Ребенок наследуем от Человек Мама Папа. Мама и Папа — от Человек.

А потом заказчик говорит, что все они живут в Древнем Риме и у папы есть раб. И вы заводите класс Slave, наследуете его от Human и добавляете в Father композицией, потому, что раб папе принадлежит. Верно?

khrundel ★★★★
()
Ответ на: комментарий от khrundel

Вот я ещё не проснулся с утра, а ты меня уже почти отговорил от ООП насовсем. Потому что в реляционных СУБД 3-я нормальная форма и подобные проблемы даже не возникают :)

den73 ★★★★★
() автор топика
Ответ на: комментарий от linearisation

Всего лишь следование вашим заветам, вы же наследуете ребёнка от папы с мамой, соответственно и владение нужно так же переносить. Раба часто посылают на рынок, но деньги не доверяют, раб просит записать на счёт хозяина, ссылается то бишь, соответственно в раба добавляем невладеющую ссылку.

khrundel ★★★★
()
14 марта 2017 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.