Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 208 209 [210] 211 212 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#3136
,
|
|
|
|
Если бензобака нет - вернет 0 литров или сгенерирует исключение.
Добавлено Цитата Romkin @ Если возникает такая необходимость - значение будет передано как параметр конструктора. А случай, когда в конструкторе предка поле инициализируется в 1, а в конструкторе потомка надо туда поставить 2, не приводит к двойной инициализации? |
|
Сообщ.
#3137
,
|
|
|
|
Цитата Romkin @ Во-во. Чем больше беседую, тем больше убеждаюсь, что программирование на С++ - это такой особый вид мазохизма. Ужас. Сравнимо с тем, чтобы иметь в гараже Ford-T, и ездить на нем, уверяя всех, что это круто. И периодически раз в десятилетие обращаться в мастерскую, чтобы привесили новые фишки, например, ремни безопасности за десяток лет наконец-то придумали как навесить ![]() Это ошибочная оценка, типичная для оценки со стороны Для меня язык вообще имеет мало значения. Язык должен выбираться исходя из задачи и придуманной архитектуры системы. Более того, выбор языка можно отложить и на тот момент, когда будет завершена первая итерация проектирования и завершены прототипы... Все зависит от задачи. И на этом уровне языковые детали уже не так важны - нужно лишь сделать правильный выбор и следовать ему, не пытаясь использовать язык не по назначению. Цитата OnPing есть и у объекта и у коллекции. Событие приходит в OnPing объекта всегда, а в событие коллекции - если он в ней. Эссно, если есть обработчик. Я в очередной раз забыл механизм событий в Delphi, но помню шарповый, они сильно отличаются? Мне показалось, что при помещении события в коллекцию, подписаться на это событие должна коллекция, чтобы при его приеме породить событие для своих подписчиков. Так? А при удалении, коллекция просто "отписывается" от события объекта. Так? Правда я так и не понял, причем тут интерфейсы и ушел несколько в другую сторону Добавлено Цитата Romkin @ Цитата D_KEY @ "Сишники" не бедные и знакомы с другими языками. Как говорится в "старой" поговорке, "любой уважающий себя сишник знает ещё с десяток других языков, главным образом для того, чтобы их обсирать". Скорее даже можно сказать, что с каждым языком они пытаются работать точно как с С++ И когда это не получается - начинают обсирать. "Если это выглядит иначе, чем в С++ - значит, это неверно. Аминь". смотри выше. В данной серии холиваров я просто никак не могу понять, где и зачем можно применить Delphi. Добавлено Цитата Flex Ferrum @ Цитата Romkin @ Понимаешь, тут меня все толкают на то, что создание и инициализация - это конструктор. Ну я и пытаюсь объяснить, так чтобы поняли, что создание и инициализация - разные этапы. Создание - сразу всего объекта, а потом остается его инициализировать как надо, это уже программист пишет. И тут его воля, хочет - вызовет инициализацию от TAbstractButton, хочет - напрямую поле установит. Если долезет, конечно. Понимаю. C++ тоже есть подобное разделение. Отдельно - аллокация (опционально), отдельно - конструирование, оно же инициализация. А у них, как я понимаю, не "оно же" |
|
Сообщ.
#3138
,
|
|
|
|
Что-то я про новый стандарт читал... Новый стандарт Strongly typed enums. Не? |
|
Сообщ.
#3139
,
|
|
|
|
Цитата D_KEY @ А у них, как я понимаю, не "оно же" Угу. В итоге имеем пенальти на двойной инициализации. Добавлено Цитата Romkin @ Что-то я про новый стандарт читал... Новый стандарт Strongly typed enums. Не? Не. Это про другое. |
|
Сообщ.
#3140
,
|
|
|
|
Цитата Romkin @ Это некоторое ужесточение контроля. Новый стандарт Strongly typed enums. Не? |
|
Сообщ.
#3141
,
|
|
|
|
Цитата D_KEY @ Я в очередной раз забыл механизм событий в Delphi, но помню шарповый, они сильно отличаются? Мне показалось, что при помещении события в коллекцию, подписаться на это событие должна коллекция, чтобы при его приеме породить событие для своих подписчиков. Так? А при удалении, коллекция просто "отписывается" от события объекта. Так? Правда я так и не понял, причем тут интерфейсы и ушел несколько в другую сторону Ну на интерфейсах у меня получилось естественных образом, поскольку сисадмин юзает vbs И обсервер для событий соответственно есть ужо. Но на чистом Delphi это эквивалентно: в метод IPing подается интерфейс с методом обратного вызова.Интерфейс мне позволил обрамить интерфейс враппером-элементом коллекции, ничего не зная при этом о классе-реализаторе. Мнемонически где-то так: ![]() ![]() type TCollectionItem = class(TInterfacedObject, IPing) private FPing: IPing; FCollection: ICollection; protected property Ping: IPing read FPing implements IPing; public constructor Create(ACollection: ICollection; APing: IPing); destructor Destroy; override; end; implementation constructor TCollectionItem.Create(ACollection: ICollection; APing: IPing); begin inherited Create; FPing := APing; FCollection := ACollection; //... FPing.RegisterCallback(FCollection.OnPing); end; destructor TCollectionItem.Destroy; begin FPing.UnregisterCallback(FCollection.OnPing); inherited; end; Собственно все. Элемент коллекции реализует IPing. В реале чуть сложнее, там у элемента нет подсчета ссылок, его коллекция уничтожает. Ну и коллбек посложнее... |
|
Сообщ.
#3142
,
|
|
|
|
Romkin, так а на абстрактных классах почему нельзя будет также сделать? Или я опять запутался и мы не о том спорили
? |
|
Сообщ.
#3143
,
|
|
|
|
Цитата D_KEY @ смотри выше. В данной серии холиваров я просто никак не могу понять, где и зачем можно применить Delphi. Дык понятно, зачем нужен другой язык, если есть С++ ![]() Видишь ли, мы уже спорим очень долго, что само по себе указывает на тот факт, что на Delphi можно делать почти то же, что на С++. Просто на нем это можно делать проще и с удобствами для программиста. Естественно, за удобства надо платить, но эта плата невелика и все больше нивелируется. И исповедовать принцип минимализма всегда я не буду ![]() Особенно если учесть, что Delphi в область драйверов и микроконтроллеров не суется. Добавлено Цитата D_KEY @ Romkin, так а на абстрактных классах почему нельзя будет также сделать? Или я опять запутался и мы не о том спорили Хм. Ну покажи, как можно уничтожить TCollectionItem, оставив от него часть, которая реализует функциональность IPing? У меня-то все понятно: он делегировал этот функционал объекту, который уже есть, причем без доступа к коду этого объекта и без своей реализации интерфейса. |
|
Сообщ.
#3144
,
|
|
|
|
Тогда зачем в Delphi запихнули ненужную вещь?
|
|
Сообщ.
#3145
,
|
|
|
|
D_KEY, а, и учти еще, что у меня в этом коде все защищено: объект, реализующий IPing, не уничтожится пока он есть в коллекции.
Добавлено Цитата trainer @ Тогда зачем в Delphi запихнули ненужную вещь? А зачем вам Цитата trainer @ Новый стандарт Strongly typed enums. Не? Это некоторое ужесточение контроля. ![]() strict private - это именно ужесточение контроля. |
|
Сообщ.
#3146
,
|
|
|
|
Цитата Romkin @ Хм. Ну покажи, как можно уничтожить TCollectionItem, оставив от него часть, которая реализует функциональность IPing? Если взять во внимание тот факт, что в С++ конструкторы/деструкторы - фактически создают/разушают объект, а в делфи - Конструкторы/деструкторы - ничего не создают/разрушают, а всеголишь инициализируют/деинициализируют, то в С++, конструктор заменяется на любой метод, деструктор заменяется на любой метод, допустим их можно обозвать Initialize/Deinitialize вот и все... |
|
Сообщ.
#3147
,
|
|
|
|
Цитата Romkin @ Хм. Ну покажи, как можно уничтожить TCollectionItem, оставив от него часть, которая реализует функциональность IPing? А вот мне интересно посмотреть на код конструктора какого-нибудь делфийского класса, у которого есть нетривиальные базовые классы, требующие недефолтной инициализации своих мемберов. |
|
Сообщ.
#3148
,
|
|
|
|
Цитата Romkin @ Подсчет ссылок - это секретная технология Delphi, недоступная в других языках. и учти еще, что у меня в этом коде все защищено: объект, реализующий IPing, не уничтожится пока он есть в коллекции. |
|
Сообщ.
#3149
,
|
|
|
|
Цитата Flex Ferrum @ А вот мне интересно посмотреть на код конструктора какого-нибудь делфийского класса, у которого есть нетривиальные базовые классы, требующие недефолтной инициализации своих мемберов. Хватит ходить вокруг да около ![]() Да и хватит уже беседовать конструкторах, было уже. Мне очень трудно вообразить себе класс с таким нетривиальным базовым классом. Нужно недефолтное - сделай в конструкторе, наследник его вызовет. Если уж совсем приперло - перекрываешь NewInstance, это виртуальный метод. Добавлено Цитата trainer @ Подсчет ссылок - это секретная технология Delphi, недоступная в других языках. Э, батенька. У вас классы тоже автоматом уничтожаются при выходе из области видимости. Вопрос тут не в этом, а в том, сколько чего понадобится нацеплять в С++. |
|
Сообщ.
#3150
,
|
|
|
|
Цитата Romkin @ Да и хватит уже беседовать конструкторах, было уже. Мне очень трудно вообразить себе класс с таким нетривиальным базовым классом. Нужно недефолтное - сделай в конструкторе, наследник его вызовет. Да вот мне интересно - как? И чем это тогда отличается от сборки экземпляров классов "из предков"? |