Eternal_ShieldЦитата: Не будет. Чтобы достать интерфейс IRichEdit через IHistory, то придётся юзать hist.QueryInterface.
Я примерно так и предполагал. В смысле, что перекрёстный каст, который на Плюсах выполняется не сложнее нисходящего, в Дельфи делается в два этапа: сначала к общему - хоть потомку, хоть предку, неважно - классу, затем к нужному. В принципе не суть важно, разве что требуется знать об иерархии больше, а именно помимо исходного класса и класса-назначения ещё и какой-нибудь промежуточный общий.
Кстати, рад, что не все дельфисты как только так сразу бегут исследовать RTTI руками. Бо я слишком уж часто встречал таких.
wasilissk, ты потроллить сюда заходишь или прикидываешься?
Цитата: Все фразы про интерфейсы были написаны именно в контексте делфи.
Цитата: Ну вот только не надо доказывать, что белое это черное.
Все фразы были высказаны в ответ на твоё заявление о ненужности множественного наследования реализаций при тем не менее допустимости множественного наследования интерфейсов. Ежели ты окромя Дельфи ни на чём больше не писал (что вообще-то было бы странным, но выходит, что так), то я тут ни при чём. Интерфейс и реализация - это понятия из ОО проектирования, а не ОО программирования. Кого как, но меня учили проектировать до программирования, а не наоборот.
Цитата: Иерархия, в которой скрываются методы, опубликованные в предке, просто по определению не удовлетворяет принципу замещения Лисков, потому что потомок не может выступать на месте предка.
А я о чём? Он не выступает, и даже не собирается. Что дальше? Таки понял суть, или будешь сам себе противоречить?
Цитата: Ты с этим спорить собираешься?
Нет, не понял.
...Ок, вопросов больше не имею.
Цитата: Ложь и искажение, я не об этом писал.
Ну... Если ты имел в виду другое, надо было говорить это самое другое. А так ты сказал ровно то, что сказал. И кстати, я-таки не увидел, какой же всё-таки из тех нумерованных пунктов прокольный.
Цитата: В предложенной тобой делфийской реализации интерфейсы не нужны.
Аха. Т.е. реализация интерфейсов может существовать и без наследования от них? Не, конечно можно так поступить, но во-первых, почему тогда это будет называться реализацей интерфейса, и во-вторых, а как-же полиморфизм, и в-третьих
, а как же ТЗ? Вот дали ТЗ, там курсивом по ариалу написано "...должен реализовывать три интерфейса..." ТЗ выпущено консилиумом системных интеграторов доброго десятка специализаций, работавших над архитектурой системы добрых пол-года. И чё? И хде? Минус премия устроит за срыв сроков, или будешь искать аргументы для спора с кандидатами наук, своими кураторами, ибо твоя фирма - всего лишь подрядчик, и ведущими инженерами, у которых этот проект уже пятый по счёту? Я не шучу. Это не дядя с кипой флешек в кармане пришёл сайт заказывать, эти люди реально знают, как должен быть устроен самолёт или атомная станция.
Цитата: Кастомизация это преобразование одного типа к другому.
Кастомизация - это customisation, настройка обощённого модуля под конкретику контекста. То что ты имеешь в виду - это каст, cast, и это сленг, ибо правильно тогда уж тайпкаст.
Цитата: Если изначально посетитель проектировался исключительно для работы с IHistory, а его потомок с никоим образом не связанным с ним IRichEdit-ом стал работать - это называется полным переопределением поведение класса в его потомке.
Конструктива нет и не будет. Не верю, что ты прикидываешься, а троллей я ненавижу, и это ещё мягко сказано.
Цитата: Переделывать посетителя,...
Уволен. Ты ещё TObject перепиши в подобной ситуации.
Цитата: Т.е. объектное программирование, как не объектно-ориентированное, реализуют неимперативные языки?
Не обязательно. Чистое ОП плохо укладывается в императив. А для императива чистое ОП неудобно. Так что ООП - это золотая середина, но с большим перекосом в угоду императиву, чем в угоду ОП.
Цитата: В перечисленном тобой списке условно к неимперативным можно причислить лишь common lisp, однако опять же незадача, про него написано, что он объектно-ориентированный.
Не он конкретно, а некая библиотека делает его таковым. Не помню, какая. И вообще, императивность я затронул, поскольку немногие готовы взяться за неимперативные языки за просто так, ради нематериальной выгоды.
Цитата: Это утверждение о том, что в любой книжке по проектированию есть определение объектного программирования как не объектно-ориентированного?
Нет. Это есть утверждение о том, что в любой книжке по проектированию нет программирования. Если есть, то это уже не книжка по проектированию. Но это не означает, что чтобы получить предстваление об ОП, требуется именно книжка по проектированию. Можно рассмотреть и книжки по программированию, где рассматривается язык, реализующий множественное наследование лучше, чем C++.
deloverЦитата: В Дельфи это реализуется весьма просто, до банальности, хотя если интерфейс уже прописан будет диссонанс между объявлением компилятору и саппортом Query.
Опять же. Не следует подходить к разговору об интерфейсах и их реализациях в контексте какого-либо языка. Это разговор в первую очередь об архитектуре некой подсистемы. Её реализация в коде вторична. И именно с этих позиций имеет смысл сравнивать ООП-модели языков. Иначе будет вот такой вот разговор, как у меня с
wasilissk-ом.
Ага, ну вот и ты тоже написал, нечто подобное как у
Eternal_Shield. Только я за qip := Hist AS TQip; тогда уж, потому как далеко не каждая реализация IHystory является TQIP-ом.
Цитата: Забываю, если сохряняется условие выполнимости, сложно согласиться с утверждением о невыполнимости множественного наследования.
Именно.
Множественное наследование ничем не отличается от простого. Ну вот просто ничем. Ну вот какая разница, столько у объекта непосредственных предков? Почему если они интерфейсы - это якобы нормально, а если нет, то якобы плохо? Если агрегацией успешно можно имитировать множественное наследование, зачем тогда нужно простое, если агрегация сможет его имитировать не хуже? Я тупо не понимаю логики. Если мы против множественного наследования, так мы и должны быть против. Если мы его допускаем, значит мы его просто допускаем, зачем ограничения? Я вижу единственное объяснение: байка о ненужности множественного наследования реализаций - это маркетинговый ход, ибо архитекторы языка не осилили или не хотят выпячивать недостатки принятой ОО модели, чтоб они стали заметны. Вот C++ не стал комплексовать по этому поводу, а Дельфи и C# решили не рисковать.
Ещё раз. Проблема ромба - это не проблема множественного наследования, это проблема задача дизайна подсистемы. Вот есть у нас классы TA, TB и TC. Нужно их собрать в единый компонент. Каждый их них является производным от TLog, некого логгера. Ну, допустим он пишет журналы, каждый экземпляр TLog в отдельный файл. Таков дизайн. Надо, чтобы TA и TC разделяли общий экземпляр, потому что у них один файл ждурнала, а TB имел отдельную копию журнала. Причём тут программирование, если таков дизайн системы? Да, вот так спроектировали. Что с ней не так? Почему это плохой дизайн, и таких существовать не должно? Та вся VCL такова вообще-то, если копнуть принципы её устройства. Просто этого не очень видно, потому что мало кто изучает её философию, а не предоставляемые возможности, и поэтому мало кто видит, где за динамическим полиморфизмом и ссылками на интерфейсы в параметрах конструкторов объектов на самом деле скрывается замаскированное множественное наследование с разделением или объединеним атрибутов. Разделять или объединять аттрибуты - это задача - задача, а не проблема! - архитектора. И как он спроектирует, так и должно быть. После этого проблемы ромба просто нет, потому что дизайнер явно указал, что и как дожно быть. Берём и пишем.
Что делают Дельфисты, когда получают в разработку такой компонент? Правильно, говорят, что это говнодизайн и перепроектируют подсистему. Хотя почему говнодизайн, вменяемых аргументов от них обычно не дождёшься, окромя отсыла к Help и литературе по Object Pascal, писанной авторитетами. Хотя аргумент есть и весьма прост - их ОО модель этого не позволяет. Ну, некоторые это понимают и честно так и говорят. И я не вижу тут ничего такого уж предосудительного. Они сами выбрали инструмент разработки, имели право, и идут на компромиссы с его требованиями, и это неизбежно. И когда это приемлимо, та ради бога. Только вот не всегда приемлимо.
Что делают Плюсовики? Та объявляют TLog виртуальным базовым классом для TA и TC и обычным для TB, и всех делов. Вопрос: почему по факту прямое следование требованиям должно считаться худшим решением, нежели витиеватый балет вокруг да около из каких-то религиозных соображений, да ещё и обманывающий по части реальных взаимоотношений между классами, реализуя не те отношения, которые заложены интерфейсами? C++ в общем-то тоже не идеален. Я могу привести по меньше мере два недостатка его ОО модели в части множественного наследования, и мне тоже придётся в реализации неких вещей нет-нет, да и подогнать дизайн под требования модели. Но я уж точно при этом не буду врать, что мне подсунули говнодизайн.
Добавлено: К слову. Правда, немного оффтопному.
Повторяющие как мантру "множественное наследование не нужно, вредно, создаёт проблемы" нужное подчекнуть мне всегда напоминают простых обывателей, слышавших о парадоксе близнецов в Теории Относительности. Ни те, ни те не могут внятно ничего сформулировать, если попросить аргументы. Первые просто отбрыкиваются негативными прилагательными и обидными существительными, без каких бы то ни было аргументов, вторые... скажем так, ещё никто, кого я спрашивал, не смог его даже правильно сформулировать, не говоря уже о том, чтобы разрешить.