ego666
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Цитата: Не IDispatch ли решает подобную проблему .. по типу той, что в примере? ... | Неее, ну его нафиг делать это через IDispatch. Цитата: и как сие попадает под определение, что родитель должен знать о всех методах всех своих наследников? | Эмм.. да я такого и не говорил и даже такого нигде не подразумевал. Цитата: В нашем случае, как IList может знать о методах в своих наследниках IFileFile, IStreamList и т.п.? С какого перепугу vtbl родителя изменится, чтобы отразить методы его наследников? ... | Ты меня наверное не понял, покажи в моём коде что ты имеешь ввиду? (и я тебе покажу, что я другое имею ввиду) Добавлено: Цитата: Хм. Тогда переспрошу - а чем принципиально отличаются интерфейсы C#/Java от Delphi? | http://docwiki.embarcadero.com/RADStudio/XE2/en/Object_Interfaces_Index Цитата: Пока мне кажется, что в Дельфи использование наследования интерфейсов происходит через Ж. Абсолютно не вижу логики. | Чукча не читатель? http://forum.ru-board.com/topic.cgi?forum=33&topic=13680&start=357&limit=1&m=1#1 http://forum.ru-board.com/topic.cgi?forum=33&topic=13680&start=374&limit=1&m=1#1 Добавлено: Цитата: WTF! - нелогично же. Зачем так сделано? Понимаю все проблемы COM, но это ж прошлый век! Даже голимый C# от этого ушел! | Интерфейсы в COM спроектировали очень грамотно, вдумываясь учли все возможные нюансы. А вот в Шарпе (и подобных) их тупо, не думая, слепили из абстрактных классов. Добавлено: Цитата: По поводу примера с IList и IFileList. А с какого перепуга мы достаем из объекта интерфейс IList и пытаемся работать с ним как с IFileList? | Покажи кодом, где я достаю IList и работаю с ним как с IFileList? Цитата: Когда же предок позволял работать с собой как с потомком? | Где это в моём коде? Ещё раз вдумчиво посмотри пример (ссылка выше). Добавлено: Цитата: Как-раз нередко нужно скрыть подробности реализации, запретить клиенту создавать или финализировать сущности, а лишь пользоваться тем, что дают. | Ситуации бывают разные. Добавлено: Цитата: THermAphrodite=class(TInterfacedObject,IBoy,IGirl) public function PreferDolls_Yes: Boolean; // for girls function PreferDolls_No: Boolean; // for boys function IGirl.PreferDolls = PreferDolls_Yes; function IBoy.PreferDolls = PreferDolls_No; end; | Скрестил ужа с ежом. И что по твоему должен вернуть метод PreferDolls, если бы ты кастанул объект к IParent? Добавлено: правильный ответ: из объекта вообще нельзя получать интерфейс IParent, если только мы его явно не указали и не реализовали в классе объекта, ключевое слово явно, т.к. конкретно в этой ситуации, с IBoy и IGirl, IParent ну не нужно и нельзя получать из объекта, реализующего оба этих наследника. Добавлено: Цитата: Да вот фиг то там! Он есть - попробуйте объявить класс с поддержкой IChild и не объявить все реализации методов для IParent! Вот именно это обстоятельство мне и кажется нелогичным: компилятор при декларации требует методы родительского интерфейса реализовать, а вот каст не проходит. | Потому что в интерфейсах наследуется интерфейс, не реализация как в наследовании классов, а интерфейс, который можно реализовать как угодно, не оглядываясь на родителя. Для IGirl реализовывает все методы IParent по своему, для IBoy - по своему. Добавлено: Цитата: Я просто считаю, что главная ошибка была в смешивании понятий интерфейс и MS COM. | Ты можешь как угодно считать? В то время, по крайней мере, Delphi разрабатывали не дураки. Если именно так сделали, значит именно так и нужно было делать. Добавлено: Ты можешь как угодно считать. (тут без знака вопроса, боюсь править пост - опять свернётся) Добавлено: Цитата: В коде прямо написано "IChild = interface(IParent)" - что должно прямо делать их родительским интерфейсом и дочерним. | для классов свои правила, для интерфейсов - свои, не надо их равнять между собой, правила классов неприменимы к интерфейсам, потому что там наследуются реализации и наследник класса обязан "поддерживать" родителя, а интерфейсов фактически ничего не наследуется и его ничто не обязывает "поддерживать" родителя. |