wasilissk
Какими именно концепциями? RAD?
Какими именно концепциями? RAD?
Синтаксисом?
множественное наследование
А мне кажется что Сишарп больше похож на Си. Как ни странно это звучит, это так. )
Это концепция Delphi?
Очевидно имелся ввиду не синтаксис.
Точнее вообще ничего общего, кроме синтаксиса, нет.
Концепции ссылочных типов, как я понимаю.
В С# отказались видеть различие между интерфейсом и объектом
В Delphi отказались от множественного, но не от агрегации.
Помнится в Си (слабо различаю C++ и C) оконные ресурсы писали текстом и линковали в ресурс, либо вставляли в код.
Чем дизайнер сишарпа похож на TFiler дельфи остаётся загадкой. Пока не понял, но уже весело.
В C# как и в Delphi совершенно определенные различия объекта от интерфейса
>В Delphi отказались от множественного, но не от агрегации.
И-и-и?..
Гораздо проще все делать в предназначенном для этого редакторе
А вот тонкости в реализации RTTI
заточенность проектирования от визуального представления, свое видение MVC это все ничего не значащий факт.
Кстати, как там насчет чего-то общего у С и C# помимо синтаксиса?
Может скажу глупость но интерфейс это таблица методов с счётчиком ссылок, вроде бы
В фреймворке, по моим представлениям - всё является объектами
Ну а то что в C++ вы их можете не замечать, так попробуйте запустить Вижуал Бэйсик. А может С++ на Бейсик похож больше?
Начинаю сомневаться, что стоит продолжать
следствие агрегации множественное наследование, немного отличающееся по синтаксису
По моему Вы о них говорите первым
Ну перечитайте вдумчиво что написано было.
...надо полагать сишарп пострадал, что в нём нет ссылок?delover, нет. Он пострадал тем, что нет единой семантики для всех типов. В C++ все типы нессылочные, и есть отдельный тип - ссылка на что-либо. Упрощённо говоря, любой тип можно сделать ссылочным по требованию дизайна.
В частности строить в ней множественное наследование реализаций было просто опасно из-за совсем уж диких неопределённостей и сложностей проектирования взаимоотношений виртуальных методов
Представь, что это на Дельфи.
В целом же, все как раз наоборот, в Delphi от множественного наследования отказались в силу его, мягко говоря, сомнительной необходимости, при совершенно явных недостатках.wasilissk, по поводу сомнительной необходимости - это известный пропагандистическоий силлогизм поставщиков ООП-моделей, не предоставляющих множественное наследование реализаций. Внимание, два вопроса:если необходимость сомнительна, почему оставили множественное наследование интерфейсов?если мой класс реализует интерфейс, вопроса нет, но если он не реализует, а является одной из уже готовых реализаций, почему он не может прямо это сделать, а должен костылить в сторону агрегации, оставив интерфейс в у себя в предках?По поводу последнего. Мало того, что это получается враньём. Если я наследуюсь от интерфейса, я им якобы являюсь, но по факту я являюсь не интерфейсом, а всего лишь одной из всех возможных его реализаций. Помимо этого, как ты абсолютно верно заметил, агрегация определяет совсем не то отношение между классами, что и наследование. Почему считается нормальным использовать иные отношения интерфейсов по сравнению с отношениями реализаций? IA и IB - наследуются, а SomeA и SomeB, реализующие эти IA и IB, агрегируются. Любой грамотный ОО-архитектор назовёт это бредом и согласится с таким дизайном только как с вынужденной мерой. Почему бы просто не унаследоваться от SomeA и SomeB? Всё показано правильно, и никто никому не врёт.
А вот в частности этот отказ позволил реализовать множество других сомнительных возможностей, типа виртуальных конструкторов.Возможности именно что сомнительны. Я только не понял, ты соглашается или споришь? Если споришь, я могу продолжить свою мысть фактами.
если необходимость сомнительна, почему оставили множественное наследование интерфейсов?
если мой класс реализует интерфейс, вопроса нет, но если он не реализует, а является одной из уже готовых реализаций
IA и IB - наследуются, а SomeA и SomeB, реализующие эти IA и IB, агрегируются
Что касается явных недостатков... ладно, просто приведи аргументы. Хотя бы один пример недостатка.
Возможности именно что сомнительны. Я только не понял, ты соглашается или споришь?
Разумеется потому, что часто возникает необходимость унаследовать поведение двух сущностей. Полная же реализация множественного наследования как is a является излишней.Наследуя интерфейсы, ты не наследуешь их реализации. Интерфейсы суть абстрактные сущности, они не имеют поведения, они его декларируют для своих реализаций. Чьи слова я перефразировал?
Написал, просто чтоб не потерялось.
Интерфейсы суть абстрактные сущности, они не имеют поведения, они его декларируют для своих реализаций.
В случае же именно что отмены базового интерфейса наследование должно быть обязательно непубличным.
И что? Где проблемы-то? А главное - где тут излишество-то?
Внимание, вопрос: как имея запасённый базовым классом IHistoryFile, от его по факту агрегированной реализации перейти к IRichEdit?
Плюсы прозрачнее, они не нагоняют тумана на иерархию, отношения и взаимозависимости.
В них всё видно на уровне опубликованных интерфейсов. В Дельфи в общем случае без знания деталей реализации невозможно построить надёжную систему со сложными отношениями между подсистемами. Другими словами, как это ни парадоксально звучит, Плюсы своей прозрачностью позволяют делать черные ящики реально чёрными, а не с альфой под 10%. ОО-архитекторы уже смотрят косо.
Но я не автор, я пользователь этого TQIP, и без того, чтобы зарыться в изучение реализации этого TQIP, я об этом не узнаю, а значит если кому-то взбредёт в голову проапдейтить THistoryFile в нашем проекте, он вот так лёгким движением руки изменит поведение TQIP.
Хотя казалось бы какая может быть связь между совершенно разными классами, однако одна из реализаций IHistoryFile оказалась зависимой от другой.
Да-да, с Плюсами будет та же картина. Но ведь её явно видно из объявления TQIP. Там явно сказано - TQIP является THistoryFile.
Интерфейс это то, что публикуется, необходимость отменять интерфейс говорит об ошибках проектирования. То, что не должно публиковаться просто вообще не должно попадать в интерфейс.Отмена интерфейса не означает конец его существования. Ты перечитался COMом, без которого Дельфи и не Дельфи вовсе. Отмена интерфейса означает, что им просто не дают пользоваться за определёнными пределами, например, некой классовой иерархии, потому что этот интерфейс не открывается вовне, но он используется внутри, во-первых, о чём явно сообщается наследованием от него, во-вторых, предоставляя возможность подкладывать различные его реализации этой иерархии.
Объединять совершенно различные сущности в одну суперсущность - есть главная проблема, это противоречит ООП в частности и здравому смыслу в целом.Сам понял, что сказал? В таком случае здравому смыслу противоречит, например, FireFox, который просто пестрит совершенно различными сущностями в лице плагинов, и где они все под одной суперсущностью - браузером.
Выше было написано, что есть ссылка на TQip, если так, то есть ссылка на все его интерфейсы, проблемы нет. Если нет ссылки, то в виртуальный конструктор "производного классе Посетителя" можно передать ссылку на экземпляр IRichEdit? C++ так умеет?Опять же, ты ничего не понял. Посетителя интересует только IHistory. TQIP его предоставляет, поэтому он тоже им будет посещаться. Тот факт, что для более ёмкой статистики в неком частном случае потребовалась TQIPовая информация, которая может быть получена от него через IRichEdit, означает не более чем то, что в этом частном случае потребовался частный Посетитель, который легко может быть получен наследованием и перекрытием одного метода. И только в этом методе потребовался другой TQIPовый интерфейс, а именно IRichEdit. Простая же задача - перейти от IHistory к IRichEdit.
За жесткое приведение IHistoryFile к IRichEdit стоит убивать на месте. В данном случае то, что С++ позволяет это делать является безоговорочным минусом C++.Дельфийный AS таков же. Так же бросит эксепнш в run-time, как и C++.
Я утверждаю, что таких ситуаций просто нет.Нда? Привести пример "попроще"? У Александреску посмотри. Его смарт-поинтер - это нечто.
Крест на множественном наследовании реализаций в Дельфях ставит здравый смысл.Ну если за пределами Дельфи ООП не существует, то вероятно да. Только вот незадача: в мире ОП иметь объекту много предков - это норма, а простое наследование скорее случаейное исключение. Это только в мире ООП с этим сложности. Слава богу не у всех ООП-языков.
Отмена интерфейса не означает конец его существования.
Ты перечитался COMом, без которого Дельфи и не Дельфи вовсе.
Отмена интерфейса означает, что им просто не дают пользоваться за определёнными пределами, например, некой классовой иерархии, потому что этот интерфейс не открывается вовне, но он используется внутри, во-первых, о чём явно сообщается наследованием от него, во-вторых, предоставляя возможность подкладывать различные его реализации этой иерархии.
Сам понял, что сказал? В таком случае здравому смыслу противоречит, например, FireFox, который просто пестрит совершенно различными сущностями в лице плагинов, и где они все под одной суперсущностью - браузером.
Тот факт, что для более ёмкой статистики в неком частном случае потребовалась TQIPовая информация, которая может быть получена от него через IRichEdit, означает не более чем то, что в этом частном случае потребовался частный Посетитель, который легко может быть получен наследованием и перекрытием одного метода.
И только в этом методе потребовался другой TQIPовый интерфейс, а именно IRichEdit.
Нда? Привести пример "попроще"? У Александреску посмотри. Его смарт-поинтер - это нечто.
Вообще, что касается множественного наследования реализаций, так паттерн Стратегия - чи как там её
Только вот незадача: в мире ОП
Касательно остального, что не комментировал, внимательно, а не по диагонали, перечитай прошлый пост. Можно не один раз перечитать, если покажется сложным. Потому как там все ответы есть, а чего нет, так то азбука. Я может и холиварщик, но не преподаватель нахаляву и тем более не тавтолог.
А если серьёзно, то нельзя человеку показать тот путь, который он не хочет видеть.
а вы уже всё рассказали
Вам не понять, я вам глубоко сочувствую....... Тоже неплохое завершение, можно сказать классическое.Ты бы предпочёл увидеть скопипасченный пост? Странно. rrromano, ты прав, в моём посте всё есть, но.
Еще раз повторяю, в Delphi невозможно отменить интерфейс.
Если тебе этого не нужно, не стоит их выносить в этот интерфейс.
Интерфейс уже давно много больше чем com.
Когда в некой иерархии приходится прятать методы которые в предках имели большую видимость, такая иерархия порочна, ее надо переделывать. Читаем принцип замещения Лисков до просвещения.
...Секундочку и по порядку.
Полностью переопределять поведение класса в его потомке – дурнейшая практика, ничего нормального в ней нет. Читаем принцип замещения Лисков до просвещения.
передаем потомку этого посетителя интерфейсную ссылку IRichEdit от класс TQip в перегруженном конструкторе.Ладно, и это разжую. Это не полное переопределение, а кастомизация. Предположим Посетитель используется для оценки эффективности кеширования строк объектами IHistory. TQIP (сейчас совершенно неважно, каким именно способом он составлен из кирпичиков) безусловно должен будет быть помещён в коллекцию к Посетителю для опроса. Так уж получилось, что реализация IRichEdit разделяет с IHistory несколько последних строк истории. Открой QIP, ну или вообще любой пейджер, так и есть. Поэтому для более точной статистики требуется это число получить также и от реализации IRichEdit и вычесть из значения, полученного у IHistory.
Код: FUNCTION getLinesCount(hist:IHistory):Cardinal;
VAR edit:IRichEdit;
BEGIN
Result := hist.getCachedLines;
TRY
edit := hist AS IRichEdit;
Result := Result - edit.getCurrentLines
EXCEPT
END
END;
Ты бы предпочёл увидеть скопипасченный пост? Странно. rrromano, ты прав, в моём посте всё есть, но.
ты ничего не понял. Сожалею.
Во-первых, Дельфи тут причём?
Но касательно Дельфи - её там не может быть в связи с самой моделью ООП.
если необходимость сомнительна, почему оставили множественное наследование интерфейсов?
Отмена интерфейса не означает конец его существования. Ты перечитался COMом, без которого Дельфи и не Дельфи вовсе. Отмена интерфейса означает, что им просто не дают пользоваться за определёнными пределами, например,
Я предъявил ТЗ, а к реализациям на языках я перешёл после этого. Ты даже этого не понял?
Впрочем, ты и тут неправ, отменить интерфейс в Дельфи можно, а иногда и нужно
Во-вторых, и это связано с во-первых. Интерфейсы требуются для регламентирования требований к реализациям. Если некая сущность является внутренней деталью некой подсистемы, почему её нельзя регламентировать?
И если можно, то почему при этом обязательно раскрывать наружу?
Похоже тебе самому Лисков перештудировать не помешало бы.
В-третьих, вот чему-чему, но учить меня проектировать не следует. Дельфи вот - можно, я его не знаю достаточно хорошо, чтобы отвечать за все свои слова о нём. Но вот проектированию больших, гибких и масштабируемых систем... ладно, я реалист... есть куда ещё расти, но учить меня не тебе явно.
Ты уже дваджы накололся на принципах Лисков.
Не понравился пример с браузером? А что с ним не так?
Какая разница, как оно там внутри реализовано и как спроектировано?
Но ведь он явно попадает под твоё определение говнопродукта, ибо вмещает в себя кучу разнородных сущностей.
Жду комментов. Очень хочется в спойлере предсказать, каких именно, но сдержусь.
Опять же, ты ничего не понял. Посетителя интересует только IHistory.
Это не полное переопределение, а кастомизация.
будет ли это работать в Дельфи?
Впрочем, ты и тут неправ, отменить интерфейс в Дельфи можно, а иногда и нужно
5. Я беру три подходящих мне реализации, по одной на каждый интерфейс
Ну вот только не надо доказывать, что белое это черное
Предыдущая тема: Сервис работы с файлами