LINUX.ORG.RU

Ромбовидное наследование

 ,


0

2

Заинтересовался я тут сабжем

Ромбовидное наследование (англ. diamond inheritance) — ситуация в объектно-ориентированных языках программирования с поддержкой множественного наследования, когда два класса B и C наследуют от A, а класс D наследует от обоих классов B и C. При этой схеме наследования может возникнуть неоднозначность: если метод класса D вызывает метод, определенный в классе A (и этот метод не был переопределен в классе D), а классы B и C по-своему переопределили этот метод, то от какого класса его наследовать: B или C?

Поигрался немножко, и понял, что никакой неоднозначности тут не возникает и возникнуть в принципе не может.


A=function(){this.x=1}

B=function(){this.a=10; this.x="another_B"}
C=function(){this.b=20; this.x="another_C"}

tmp=new A
B.prototype=tmp
C.prototype=tmp
delete tmp

D=function(){}
tmp=new B
C.call(tmp)
D.prototype=tmp
console.log(tmp) // { a: 10, x: 'another_C', b: 20 }
delete tmp

d=new D

console.log(d.x, d.a, d.b) // another_C 10 20

Тут абсолютно очевидно, что D наследует от C, поскольку мы видим, что в строке C.call(tmp) мы затерли x новым значением.

Таким образом, мы видим, что данная проблема не является проблемой в общем смысле, а это быдло-дизайн-ЯП-специфичная проблема. Просто в некоторых «ЯП» слишком много подковерной возни.



Последнее исправление: anonimous (всего исправлений: 1)

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

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

Ладно, можно сказать проще. Есть идеальный Алан-Кеевский, «изначальный» ООП, в котором нет никаких проблем. Есть то, что сейчас, по недоразумению, принято называть ООП. Там существуют проблемы. Множество. Ромб — это одна из них.

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

Настоящая сила — в смолток/селф корнях. Да, так работает прототипное ООП.

давай так..

а почему бы тебе не написать свою собстуенную (более сложную) реализацию ООП в JS ?

если уж стандартная тебе не нравится.

например такую, в которой ты будешь декларировать новые классы как:

var MyCLass_A = declare_class({
    // ...
    // ...
    // ...
})

var MyCLass_B = declare_class({
    // ...
    // ...
    // ...
}, MyCLass_A)


var MyCLass_C = declare_class({
    // ...
    // ...
    // ...
}, MyCLass_A)

var MyCLass_D = declare_class({
    // ...
    // ...
    // ...
}, new Set([MyCLass_B, MyCLass_C]))

var d = make_from_class(MyCLass_D)

где последний класс «MyCLass_D» — наследует «MyCLass_B» и «MyCLass_C» через Set :-)

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

вместо стандартного ООП

Ты не забывай, что то что ты называешь «стандартное ООП» в JS вообще не существует. Это естественная для JS парадигма, а не хаки.

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

ну вообще-то в JS существует стандартное ООП и работа с ним происходит стандартными конструкциями.

XXX.prototype.xxx там в этих конструкциях — играет глувную роль.

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

Стандартная парадигма JS — делать менюшки на сайтах. Остальное — хаки.

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

стандартная тебе не нравится

Да, стандартная (++/java - like), мне не нравится, но та, что в JS — очень даже ничего. Поэтому, нет нужды писать сверх ее что-то. Меня все устраивает.

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

Можно подумать ты бы смог что-то написать

anonymous
()

Попробуй программировать на ассемблере.

Абсолютно никаких проблем, о которых ты пишешь. Можешь сделать всё как тебе хочется.

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

Да, я все собираюсь до нео добраться, все никак не получается. Там надо, вроде, шестнадцатеричные, восьмеричные, n-ичные, переводить в уме друг в друга, это ч*бство меня обламывает. А так, я уверен, что любое ООП я смог бы навелосипедить на любом языке, только для этого его надо учить, к сожалению.

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

Твои быдло замыкания — это и есть основа быдло-ООП. Если бы у тебя была капля мозгов, ты бы понимал, что тут нечем гордится, вливайся в говно, это твоя судьба.

anonimous
() автор топика
Ответ на: комментарий от stevejobs

Тсс, выучит он ассемблер, начнет более толстые темы создавать

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

Я даже не понимаю о чем ты говоришь. Расшифруй. Особенно интересует, кто такой золотце. Если он оворит то же, что и я — значит дело говорит. Я бы почитал.

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

Если он оворит то же, что и я — значит дело говорит

точичныи пары осилил, быдляк

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

а ТС уже что-то написал? помойму главная фишка сабжа была в том, что Юлечка таки что-то зделала [лурк:вначале_добейся], а ТС только пишет наркоманские хэллоуворлды для разумных грибов из другой галактики

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

ну да, просто анонiмус начал чушь нести как раз во время летней активности никитушки в интернетах (работу искал он). да и sicp, функциональное программирование и математика, совпадение может быть

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

если коротко, то надо взять какую-нибудь твою любимую игру, и написать к ней открытый клиент с использованием оригинальных ресурсов игры. На своем любимом языке, конечно. Желательно не использовать готовый язык, а самостоятельно написать его реализацию, с исправлением всех ненужностей и ошибок в дизайне (копать глубоко не нужно, только самое основное). Потом нужно написать на ЛОР цикл небольших постов о том, какие именно решения были сделаны при дизайне игры, компилятора и тулчейна, почему, и почему это лучше аналогов. (в постах можно несколько раз оскорбить анонимуса проявляя глубину его неграмотности в базовых вещах)

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от user_id_68054

Я прочитал, таки, твое сообщение

вместо стандартного ООП инициализирует экземпляры членами-функциями напрямую в конструкторе.

Ты, видимо не в курсе, что в JS функции являются first-class, и это обычная практика, и это не баг, а фича. В быдло-язычках нет полноценных анонимных ф-ций, отсюда и это ограничение.

слишком умно. тут нужно чуть поглупее писать, ато не интересно будет

смешно читать об этом :) И что же тут слишком умного? То что ты путаешь причину со следствием, а недостаток с преимуществом?

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

Ты, видимо не в курсе, что в JS функции являются first-class

я-то в курсе, но пока что ещё не вижу ни где чтобы ты в аргументе функции — передавал бы ссылку на функцию-или-на-класс :)

канонический пример: https://docs.python.org/3/library/functions.html#sorted (аргумент «key»)

недостаток с преимуществом

о боженьки! ды знаем мы все что на JS можно писать говнокод. язык позволяет это.. но зачем? :-)

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

Я не знаю, что там у вас в ПИтоне, я слышал, что там, как раз, нет полноценных функций, Я не совсем понял, что ты подразумеваешь под передачей ссылки, но, это примерно вот так будет

fu=function(){console.log("foo")}
tst=function(link){return eval(link)()}
tst("fu")//foo
Вообще, я не вполне уверен, что ты понимаешь, о чем говоришь
a=function(){console.log("foo")}
b=a
delete a
b()//foo
Ты осмневаешься, что ф-ции в js first штоле, или чо?

anonimous
() автор топика
Ответ на: комментарий от user_id_68054

Просто так ты не можешь передать ссылку на функцию, или даные, в функцию из-за того, что у нас энергичные вычисления. В момент вызова ссылка спазу вычисляется в значение. Но это не отменяет.

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

ты там хоть 'use strict' не забудь указать в своих скрипт-файлах, перед тем как что-то делать :)

а-то мне аж иногда за тебя становится страшно :)

Ты осмневаешься, что ф-ции в js first штоле, или чо?

в этом я не сомниваюсь. :)

но first-class это не синоним фразе «я буду засовывать ВСЕ функции в переменные». :-)

first-class обозначает лишь что мы *можем* засунуть ссылку на функцию (или на класс) в переменную — но делать это *не_надо* для *всех* функций. (делать это надо только при необходимости. когда надо — тогда и сощлёмся на функцию! вот как нужно думать :))

отвлечённый пример:

представь что ты не умеешь произносить букву «р».

а если потом вдруг ты начуился её произносить (хвата логопеду!) — то тыже НЕ будешь ВЕЗДЕ её вставлять? («РрррРРРрр! здрррРРрраствуйте всеееерррРР!» :))

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

Я немного ковырялся в перле, когда только начинал знакомится с программированием, но тогда я не мог оценить по достоинству, хотя, перл - очень гибкий и мощный язык, да. Но я бы не стал утверждать, что там все есть строка. Все есть строка — это когда вообще нет типов. Думаю, примерно как в тикле. У меня сейчас в планах углубиться в тикль, прежде всего, не знаю, дойдут ли руки до детального изучения перла.

anonimous
() автор топика
Ответ на: комментарий от user_id_68054

я буду засовывать ВСЕ функции в переменные

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

function foo(){}
тут foo --это имя, но в глобальном объекте создается ссылка на эту функцию и она становиться foo=function foo(){}. Про переменные, в контексте JS, вообще говорить не совсем корректно. Там все является сообщением. Т.е., в данном случае, если мы в топ-левеле вызываем foo, мы, семантически, посылаем сообщение глобальному объекту. Про переменные имеет смысл говорить лишь тогда, когда идет речь об идентификаторах, объявленных с var.

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

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

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

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

function foo(){}

есть кой какие отличия функции от переменной.

смотри ниже пример

(function (global) {
    'use strict'
    
    function foo (x) {
        console.log('я говорю -- ' + x.toString())
    }
    
    // расскомментируйте этот блок, чтобы получить ошибку
    //
    //if (3 > 4) {
    //    function baz (f) {
    //        f('не')
    //        f('льзя')
    //    }
    //}
    
    function bar (f) {
        f('г')
        f('ня')
    }
    
    foo('фи') // обычное выполнеие
    
    bar(foo) // пример first-class выполения
    
    // в итоге мы 3 раза выполнили эту функцию foo()
    
    //delete foo // и это тоже делать запрещено
                 // (хотя с переменными тоже это запрещено делать)
})(this)

а теперь вопрос.. как думаешь — почему на функцию налогатся такие ограничения в отличии от переменных?

ответ (так как сам ты врядли ответишь:)): потому что функции более оптимизирвоаны чем переменные (или могут быть оптимизированы — при желании разработчика JS-движка).

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

Давненько... Десяток-второй тредов назад.

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

Это не из той оперы. Это особенности компилятора. Там, за первый проход все функции, объявленные типа function foo(){}, спазу доступны при втором проходе. Это что-то вроде подъема.

//вот этот кусок 
fu()
function foo(){}

//раскрывается в
var foo=function foo(){}
fu()

//этот
foo()
var foo=function(){}

//в этот
var foo; 
foo() // соответственно ошибка undefined()
Зачем ты там объект вызова передаешь параметром вообще, я хз, он там не при чем, и никак не используется. delete работает только для св-в объектов (в том числе и глобального). Переменные созданные с var и внутри замыканий переданные с параметрами удалить невозможно.

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

какой ещё не той оперы — ты раскомментировал тот блок который запрещено было раскомментировать (функция baz) ?

    // расскомментируйте этот блок, чтобы получить ошибку
    //
    //if (3 > 4) {
    //    function baz (f) {
    //        f('не')
    //        f('льзя')
    //    }
    //}

ошибка не появилась?

Зачем ты там объект вызова передаешь параметром вообще, я хз, он там не при чем, и никак не используется

что и где не используется? всё там используется!

блин... смотри внимательнее!

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

Я чет непонел. Я даю тебе то, что ты просил. А ты мне говоришь: не, напиши мне кривой неработающий код, чтобы я доказал тебе, что ничо не работает. Ну-ну...

царем повеяло, к чему бы

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

Твои быдло замыкания — это и есть основа быдло-ООП. Если бы у тебя была капля мозгов, ты бы понимал, что тут нечем гордится, вливайся в говно, это твоя судьба.

сильно повеяло...

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

А, так у тебя strict mode там мозги e*ет. Он не хочет, чтоб ты декларировал ф-ции там где ему не нравится. Отсюда и ошибка. Что сказать то хотел?

anonimous
() автор топика
Ответ на: комментарий от user_id_68054

что и где не используется? всё там используется!

Я не вижу, где он используется. Да и вообще, глуповато как-то выглядит — передавать явно контекст вызова, когда твой код и так исполняется в контексте вызова. Что бы это значило?

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

А, так у тебя strict mode там мозги e*ет. Он не хочет, чтоб ты декларировал ф-ции там где ему не нравится. Отсюда и ошибка. Что сказать то хотел?

хотел сказать что пиши код нормально!

функции нужны для функций.

переменные нужны для переменных.

prototype нужно для ООП.

а 'use strict' просто позволяет делать чуть меньше ошибок, если ты пишешь код как надо.

ошибка не из-за того что я использовал 'use strict', а из-за того что функцию не нужно засовывать в условный оператор. (а переменную засовывать можно, и не возбраняется). 'use strict' просто помог выявить эту ошибку.

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

Что бы это значило?

показал тебе пример first-class — без задействования переменных в ненужных местах.

а-то у меня складывается ощущение что ты будто из-за этого first-class — везде засовываешь все функции в переменные :-)

глуповато как-то выглядит

зато менее глуповато чем писать

var foo = function (/* ... */) {
    // ...
}

:-)

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

Я не использую use strict, это во-первых, во-вторых, он не имеет ни малейшего отношения к JS. Парсер просто тупо проходит текст еще до исполнения, и тупо кидает ошибку, если ему в тексте что-то не нравится. Это умники из комитетов стандартизации чудят, в перерывах между банкетами. Маразм крепчает. Вместо того, чтобы понять, как работает язык, давай превратим его в очередную жабу. Кто бы сомневался.

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

Я не использую use strict, это во-первых, во-вторых, он не имеет ни малейшего отношения к JS

если ты не используешь 'use strict' — значит ты просто очередной любитель хаков, с тараканами в голове.

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

Это умники из комитетов стандартизации чудят, в перерывах между банкетами. Маразм крепчает.

глупые людишься из комитате стандартизации — и умный ты, который програмирует 2 года. :-)

блин. мы 15~20 лет в этой теме.

думаю мы-то лучше знаем как надо!

превратим его в очередную жабу

в Java — нет prototype .. так что не ври.

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

показал тебе пример first-class — без задействования переменных в ненужных местах.

Не, еще раз. при объявлении function foo(){} создается ссылка на -фцию, поэтому явно записывать в переменную не обязательно, это будет сделано автоматом, first от этого не перестают быть first. Я не понял, зачем ты явно передаешь this (причем никак ее не используешь)?

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

зачем ты явно передаешь this (причем никак ее не используешь)?

в данном примере это нужно было лишь чтобы показать что глобальный контекст тут есть но не задействован (переменная global была явно продемонстрирована в коде, но не была задействована)

да, тут признаю что global ни как не использовалась, если ты первый раз спрашивал про это.. (надо было более ясно меня спросить :))

ну впрочем я вижу ты это понимаешь.. так что тут разговоры будут наверно излишними.

при объявлении function foo(){} создается ссылка на -фцию, поэтому явно записывать в переменную не обязательно, это будет сделано автоматом, first от этого не перестают быть first

да, да, да.. вот поэтому и не надо засовывать функции в переменные.

особенно не нужно писать this.foo = function (/* ... */) { /* ... */ }

потому что *вместо* этого нужно использовать либо обычные функции, либо прототипы. :)

и не забывай 'use strict'

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

Он ещё в прошлом треде рычал на это, что это для быдлокодеров. Очень надеюсь, что через пару версий сделают это дефолтным неотключабельным поведением. Хочу прочитать последующий йогурт пациента.

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

а теперь вопрос.. как думаешь — почему на функцию налогатся такие ограничения в отличии от переменных?

Да, не заметил сразу вопрос. Это была (неудачная) преодолеть противоречие (мб кажущееся). Оно связано, как раз с подъемом, о котором я писал выше


//код ниже противоречив, компилятор вытаскивает функцию наружу, хотя код внутри if не должен выполнятся:
;(function(){
if(false) function foo(){console.log("foo")}
console.log(foo) // [Function: foo]
})()

//а вот так противоречия уже нет:
;(function(){
if(false)var foo=function(){console.log("foo")}
console.log(foo) // undefined
})()

//а теперь внимание! Бомба!!!
"use strict"

foo()//foo
if(false)function foo(){console.log("foo")}

И ты еще рассказываешь мне о том, что у комитетчиков есть мозг?

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