Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 209 210 [211] 212 213 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#3151
,
|
|
|
|
Цитата Flex Ferrum @ Да вот мне интересно - как? И чем это тогда отличается от сборки экземпляров классов "из предков"? Тем что в делфи, все это собирать ты будешь ручками, в этом и вся фишка |
|
Сообщ.
#3152
,
|
|
|
|
Цитата Romkin @ Цитата D_KEY @ смотри выше. В данной серии холиваров я просто никак не могу понять, где и зачем можно применить Delphi. Дык понятно, зачем нужен другой язык, если есть С++ ![]() Да нет же. Я использую питон, всяческие "небольшие дополнительные" языки(awk и т.п.), понимаю, зачем java, зачем руби и питон, и т.д. и т.п. Цитата Видишь ли, мы уже спорим очень долго, что само по себе указывает на тот факт, что на Delphi можно делать почти то же, что на С++. Просто на нем это можно делать проще и с удобствами для программиста. Во-первых, у делфи узкая ниша, по сравнению с С++ и речь мы ведем исключительно о ней(по скольку в других delphi обсуждать не имеет смысла), поэтому дискуссия скорее говорит о том, что не смотря на то, что delphi рассчитана на создание прикладных программ для win32, она не превосходит С++(а должна бы). Цитата Цитата D_KEY @ Romkin, так а на абстрактных классах почему нельзя будет также сделать? Или я опять запутался и мы не о том спорили Хм. Ну покажи, как можно уничтожить TCollectionItem, оставив от него часть, которая реализует функциональность IPing? У меня-то все понятно: он делегировал этот функционал объекту, который уже есть, причем без доступа к коду этого объекта и без своей реализации интерфейса. Так тоже самое. Делаем IPing абстрактным классом, а дальше все тоже самое. Только вот зачем элементу реализовывать интерфейс IPing? Или я опять что-то не понял? Добавлено Цитата Romkin @ D_KEY, а, и учти еще, что у меня в этом коде все защищено: объект, реализующий IPing, не уничтожится пока он есть в коллекции. Ну так в языке со сборкой мусора ты бы даже не задумывался об этом. В С++ при использовании shared_ptr тоже(в данном случае). |
|
Сообщ.
#3153
,
|
|
|
|
Цитата Flex Ferrum @ Да вот мне интересно - как? И чем это тогда отличается от сборки экземпляров классов "из предков"? Тем что сборки нет. Есть инициализация. ![]() ![]() TInterfacedObject = class(TObject, IInterface) ... class function NewInstance: TObject; override; ... class function TInterfacedObject.NewInstance: TObject; begin Result := inherited NewInstance; TInterfacedObject(Result).FRefCount := 1; end; |
|
Сообщ.
#3154
,
|
|
|
|
Цитата Romkin @ Тем что сборки нет. Есть инициализация. Вот поэтому вам и приходится, в случае исключения в инициализаторе, ручками удалять в деинициализаторе - те члены, которые уже успели создастся, а в С++, это делается автоматически, машиной... |
|
Сообщ.
#3155
,
|
|
|
|
Цитата Romkin @ Есть инициализация. А чем это отличается от вызова конструктора базового класса в конструкторе потомка? |
|
Сообщ.
#3156
,
|
|
|
|
Цитата D_KEY @ Так тоже самое. Делаем IPing абстрактным классом, а дальше все тоже самое. Только вот зачем элементу реализовывать интерфейс IPing? Или я опять что-то не понял? Элемент коллекции есть IPing Ты ж хотел множественного наследования, вот оно.Цитата D_KEY @ Во-первых, у делфи узкая ниша, по сравнению с С++ и речь мы ведем исключительно о ней(по скольку в других delphi обсуждать не имеет смысла), поэтому дискуссия скорее говорит о том, что не смотря на то, что delphi рассчитана на создание прикладных программ для win32, она не превосходит С++(а должна бы). Не должна. Интересно, что такого есть в Питоне или Яве, что нельзя было бы сделать в С++? Тут скорее вопрос удобства. Добавлено Цитата Flex Ferrum @ А чем это отличается от вызова конструктора базового класса в конструкторе потомка? Уффф. Тем что ты не можешь повлиять на последовательность вызовов, а в Delphi это можно сделать. Тем, что можно вызывать при конструировании виртуальные методы, и даже конструктор может быть виртуальным. |
|
Сообщ.
#3157
,
|
|
|
|
Цитата Romkin @ Цитата D_KEY @ Так тоже самое. Делаем IPing абстрактным классом, а дальше все тоже самое. Только вот зачем элементу реализовывать интерфейс IPing? Или я опять что-то не понял? Элемент коллекции есть IPing Ты ж хотел множественного наследования, вот оно.А чем он еще является, кроме IPing? Цитата Много чего.Цитата D_KEY @ Во-первых, у делфи узкая ниша, по сравнению с С++ и речь мы ведем исключительно о ней(по скольку в других delphi обсуждать не имеет смысла), поэтому дискуссия скорее говорит о том, что не смотря на то, что delphi рассчитана на создание прикладных программ для win32, она не превосходит С++(а должна бы). Не должна. Интересно, что такого есть в Питоне или Яве, что нельзя было бы сделать в С++? Цитата Можно и так назвать. Использовать то, что лучше подходит для задачи.Тут скорее вопрос удобства. Цитата Виртуальные методы чего вызываются при конструировании? Пеленаем еще не родившегося ребенка? Цитата Flex Ferrum @ А чем это отличается от вызова конструктора базового класса в конструкторе потомка? Уффф. Тем что ты не можешь повлиять на последовательность вызовов, а в Delphi это можно сделать. Тем, что можно вызывать при конструировании виртуальные методы, и даже конструктор может быть виртуальным. Добавлено Цитата Romkin @ Цитата D_KEY @ Во-первых, у делфи узкая ниша, по сравнению с С++ и речь мы ведем исключительно о ней(по скольку в других delphi обсуждать не имеет смысла), поэтому дискуссия скорее говорит о том, что не смотря на то, что delphi рассчитана на создание прикладных программ для win32, она не превосходит С++(а должна бы). Не должна. Заточенный под что-либо инструмент обязан быть лучше универсального, иначе в нем нет смысла. |
|
Сообщ.
#3158
,
|
|
|
|
Цитата D_KEY @ А чем он еще является, кроме IPing? Элементом коллекции, он с ней взаимодействует. Хочешь потомка написать? Цитата D_KEY @ Виртуальные методы чего вызываются при конструировании? Пеленаем еще не родившегося ребенка? Что, по второму кругу? Родившегося уже. Хватит. В Java что, из конструктора тоже нельзя вызвать виртуальный метод? И как там живут? Если ты никак не поймешь, что объект можно создавать без необходимости вызова конструкторов предков, то я тебе объяснить ничего уже не смогу, сорри. Цитата D_KEY @ Заточенный под что-либо инструмент обязан быть лучше универсального, иначе в нем нет смысла. Чем Питон и java лучше C++? |
|
Сообщ.
#3159
,
|
|
|
|
Цитата Romkin @ Что, по второму кругу? Родившегося уже. Хватит. В Java что, из конструктора тоже нельзя вызвать виртуальный метод? И как там живут? Если ты никак не поймешь, что объект можно создавать без необходимости вызова конструкторов предков, то я тебе объяснить ничего уже не смогу, сорри. Понимаешь, в чём тонкость. Да, из за явного этапа инициализации ребёнок будет проинициализирован (в соответствии с перечисленными тобою правилами). Но! Формальная инициализированность экземпляра объекта не означает, что его состояние валидно. Валидным (с точки зрения объекта) его состояние будет только после отрабатывания его конструктора. И это неприятный факт ты обязан учитывать в тех виртуальных методах, которые вызываются из конструкторов предков. Ибо эти методы могут работать в условии нарушенного инварианта состояния объекта. Добавлено Цитата Romkin @ Тем что ты не можешь повлиять на последовательность вызовов, а в Delphi это можно сделать. Тем, что можно вызывать при конструировании виртуальные методы, и даже конструктор может быть виртуальным. Невозможность повлиять на последовательность вызовов - это, скорее, плюс, чем минус. По крайней мере есть полная определённость - в каком порядке что будет сделано. А не как левая пятка разработчика решила. Невозможность вызова виртуальных методов... Ну, это можно пережить. По крайней мере, с точки зрения модели языка это объяснимо. А если такая возможность кровь из носу требуется - то есть обходные пути. |
|
Сообщ.
#3160
,
|
|
|
|
Цитата Romkin @ Цитата D_KEY @ А чем он еще является, кроме IPing? Элементом коллекции, он с ней взаимодействует. Хочешь потомка написать? В смысле? Я имею в виду, есть ли тут множественное наследование? Цитата Ну так если у вас это не конструкторы, о чем мы все время говорим?Цитата D_KEY @ Виртуальные методы чего вызываются при конструировании? Пеленаем еще не родившегося ребенка? Что, по второму кругу? Родившегося уже. Хватит. Цитата В Java что, из конструктора тоже нельзя вызвать виртуальный метод? И как там живут? "Они" во всех книжках предостерегают от таких вызовов, я уже цитировал. Цитата Если ты никак не поймешь, что объект можно создавать без необходимости вызова конструкторов предков, то я тебе объяснить ничего уже не смогу, сорри. Ну так приведи такой пример, может получится. Потомок не знает, что и как делает конструктор базового класса. Вернее "что" - знает. Создает объект. Цитата Цитата D_KEY @ Заточенный под что-либо инструмент обязан быть лучше универсального, иначе в нем нет смысла. Чем Питон и java лучше C++? Питон лучше простотой и мощностью, гибкой и развитой системой типов, сборкой мусора. Java - как неплохой язык со статической типизацией и мощными фреймворками для одноименной платформы. |
|
Сообщ.
#3161
,
|
|
|
|
Цитата Flex Ferrum @ И это неприятный факт ты обязан учитывать в тех виртуальных методах, которые вызываются из конструкторов предков. Ибо эти методы могут работать в условии нарушенного инварианта состояния объекта. Естественно. Но на практике-то тоже бывает отложенная инициализация, типа создаем объект когда он понадобится, а не в конструкторе. И точно так же можно забыть вызвать из метода потомка метод предка, который и создает этот объект "по надобности". Можно сказать, что у нас один четкий инвариант: поля на нулях. Об остальных заботится программист, и уверяю, это не сложнее чем с обычными методами в наследовании. Или в С++ и с вариантом, когда поле-объект инициализируется при первом обращении к нему тоже есть автоматизация? |
|
Сообщ.
#3162
,
|
|
|
|
Цитата Romkin @ Но на практике-то тоже бывает отложенная инициализация, типа создаем объект когда он понадобится, а не в конструкторе. Замечательно. А если стейт включает в себя нечто большее, чем просто корректно проинициализированное поле? По сути получается, что при таких выкрутасах инициализация объекта у тебя размазывается по коду, а не сосредоточена в одном месте. А конструктор должен корректно отрабатывать ситуации, когда часть объекта на момент начала его работы уже сконструирована (а не просто проинициализирована). |
|
Сообщ.
#3163
,
|
|
|
|
Цитата D_KEY @ Питон лучше простотой и мощностью, гибкой и развитой системой типов, сборкой мусора. Java - как неплохой язык со статической типизацией и мощными фреймворками для одноименной платформы. Delphi тоже простой язык, может и посложнее Питона, но зато и побыстрее. Сборка мусора - велкам в дотнет, если так прикалывает. Мне-то как раз не нравится. Java - да, неплохой язык, но там вроде бы все методы виртуальные. А объекты - ссылки. Как тебя это не бесит? ![]() Статическая типизация есть и в Delphi, куда она денется? Цитата D_KEY @ Ну так приведи такой пример, может получится. Потомок не знает, что и как делает конструктор базового класса. Вернее "что" - знает. Создает объект. Я для Флекса отрывок привел из TInterfacedObject. В нем конструктора вообще нет, зато есть кастомная инициализация, модифицирован метод метакласса, NewInstance. |
|
Сообщ.
#3164
,
|
|
|
|
Цитата Romkin @ Можно сказать, что у нас один четкий инвариант: поля на нулях. "И эти люди борются за звание дома высокой культуры быта!" |
|
Сообщ.
#3165
,
|
|
|
|
Цитата Flex Ferrum @ Замечательно. А если стейт включает в себя нечто большее, чем просто корректно проинициализированное поле? По сути получается, что при таких выкрутасах инициализация объекта у тебя размазывается по коду, а не сосредоточена в одном месте. А конструктор должен корректно отрабатывать ситуации, когда часть объекта на момент начала его работы уже сконструирована (а не просто проинициализирована). Конструктор в Delphi - инициализатор, и ничего никому не обязан. Нет ситуации в Delphi, что часть объекта сконструирована, а часть - нет. Еще раз: объект - единая сущность, конструируется она одним вызовом функции, разом, как и должно. Кстати, инициализация не размазывается, она наоборот, инкапсулируется в нужных местах. Порядок создания объекта четко определен, вот только не последовательностью предков, а шаблонным методом, единым для любого объекта. |