Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 202 203 [204] 205 206 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#3046
,
|
|
|
|
Не знаю. Главное, что если захочешь, достучаться сможешь. Собственно, речь была о том, что язык не может гарантировать то, что программист будет писать что-то путное. Это и рефлексии касается, и препроцессора, и инкапсуляции, и единиц трансляции с хидерами. Я понял, что мой некорректный с точки зрения здравого смысла пример некорректен и с точки зрения стандарта - и слава богу. Спасибо |
|
Сообщ.
#3047
,
|
|
|
|
Цитата D_KEY @ Почему? На выравнивание спецификаторы не влияют, и если секция с полями одна, то все будет ок. Впрочем, мы обсуждаем какие-то малоинтересные вещи. Ещё как влияют: Раздел 1.11 [class.access.spec]: Цитата The order of allocation of data members with separate access-specifier labels is unspecified (9.2). |
|
Сообщ.
#3048
,
|
|
|
|
На мой взгляд, использование рефлексии для обхода инкапсуляции такой же "хак", пусть и разрешенный формально в языке. Я уже признал, что был не прав |
|
Сообщ.
#3049
,
|
|
|
|
Я уже писал, что затрудняюсь ответить. Может, кто-нибудь из наблюдающих за беседой шарпистов подскажет ? Цитата D_KEY @ Вводим везде ссылки, примитивные типы объявляем иммутабельными, запрещаем от них наследоваться(это ведь итак нельзя?). Какие недостатки ты видишь? На первый взгляд да, иммутабельность типов-значений устранит возможность возникновения подобных ситуаций. Но это внесёт некоторую дополнительную сложность. Например, не напишешь а: ![]() ![]() int s =0; for(int i=0;i<n;++i) s+= a[i]; Возможно,сложность - это одна из причин, почему так не сделали. |
|
Сообщ.
#3050
,
|
|
|
|
Цитата Flex Ferrum @ Цитата D_KEY @ Почему? На выравнивание спецификаторы не влияют, и если секция с полями одна, то все будет ок. Впрочем, мы обсуждаем какие-то малоинтересные вещи. Ещё как влияют: Раздел 1.11 [class.access.spec]: Цитата The order of allocation of data members with separate access-specifier labels is unspecified (9.2). Это про разделенные секции. Я говорил об одной Добавлено Цитата IL_Agent @ На первый взгляд да, иммутабельность типов-значений устранит возможность возникновения подобных ситуаций. Но это внесёт некоторую дополнительную сложность. Например, не напишешь а: ![]() ![]() int s =0; for(int i=0;i<n;++i) s+= a[i]; Возможно,сложность - это одна из причин, почему так не сделали. Ну почему же не напишешь? Формально делаем += простым синтаксическим сахаром над x = x + y и все встает на свои места. |
|
Сообщ.
#3051
,
|
|
|
|
Цитата D_KEY @ Это про разделенные секции. Я говорил об одной ![]() Смотри. Сначала при компиляции было: ![]() ![]() class A { public: int member1; int member2; private: int member3; int member4; }; Ты скомпилил, получил объектник, потом где-то подхачил: ![]() ![]() class A { public: int member1; int member2; public: int member3; int member4; }; Только вот незадача - компиль так устроен, что он приватные данные всегда размещает перед публичными. Имеет право? Имеет. Таким образом, в первоначальном варианте данные в классе лежали так: member3 member4 member1 member2 После хака все данные стали публичными, и легли так: member1 member2 member3 member4 Чувствуешь разницу? |
|
Сообщ.
#3052
,
|
|
|
|
Цитата D_KEY @ На мой взгляд, использование рефлексии для обхода инкапсуляции такой же "хак", пусть и разрешенный формально в языке. Мне не понятно, зачем такая возможность вообще существует. Нет, конечно, запреты только сужают возможности. Но зачем вообще может понадобиться изменение приватных полей? |
|
Сообщ.
#3053
,
|
|
|
|
Цитата MyNameIsIgor @ Но зачем вообще может понадобиться изменение приватных полей? Для реализации максимы: "если нельзя, но очень хочется, то можно!" |
|
Сообщ.
#3054
,
|
|
|
|
Цитата Flex Ferrum @ Для реализации максимы: "если нельзя, но очень хочется, то можно!" Угу... Один знакомый так хачил триальную либу, у которой "защита" было во флаге приватной переменной... |
|
Сообщ.
#3055
,
|
|
|
|
Цитата D_KEY @ Ну почему же не напишешь? Формально делаем += простым синтаксическим сахаром над x = x + y и все встает на свои места. А если вместо s - поле иммутабельной структуры ? |
|
Сообщ.
#3056
,
|
|
|
|
Цитата D_KEY @ К чему этот вопрос? Ты о низкоуровневых указателях на функцию и метод? Тут разница есть. А в функторе можно представить и то, и другое. Разницы действительно нет. Это абстракции разных уровней. Мне понять анонимный метод гораздо проще, чем функтор, который еще и писать надо ![]() Цитата D_KEY @ Да, если что, обычный объект в Delphi RTTI не имеет. Включение RTTI (и ее объем) определяется программистом. Интересно, наверно, ты уже рассказывал, а я пропустил. Ну да, информация о классе включается директивами компиляции. В старых версиях была только одна, определяющая наличие описания для секции published. И в библиотеке она включена для потомков TPersistent. В новых версиях ты определяешь для какой секции видимости нужна информация, и о чем, полях/свойствах/методах. И есть набор классов, позволяющий работать с этой информацией. Плюс добавились атрибуты: объекты-описания. И, кстати, в новых версиях таки RTTI по умолчанию включена. ![]() ![]() program SimpleJSON; {$APPTYPE CONSOLE} uses SysUtils, DBXJSON, DBXJSONReflect; type TFoo = class private FName: string; public function Hello: string; property Name: string read FName write FName; end; { TFoo } function TFoo.Hello: string; begin Result := 'Hello from ' + Name; end; //любой объект, лишь бы RTTI была для полей. По умолчанию стримятся поля данных function GetJSON(AObj: TObject): string; var jMarshal: TJSONMarshal; jData: TJSONValue; begin jMarshal := TJSONMarshal.Create(TJSONConverter.Create); try jData := jMarshal.Marshal(AObj); Result := jData.ToString; finally jMarshal.Free; end; end; var Foo: TFoo; jStr: string; begin try Foo := TFoo.Create; try Foo.Name := 'FooFoo'; Writeln(Foo.Hello); jStr := GetJSON(Foo); Writeln(jStr); readln; finally Foo.Free; end; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. Вывод: Цитата Hello from FooFoo {"type":"SimpleJSON.TFoo","id":1,"fields":{"FName":"FooFoo"}} Ну создание или удаленный вызов метода я не стал делать, оно примерно так же выглядит. Цитата D_KEY @ Нет, ты уже завел эту абстракцию, раз тебе это все понадобилось. Просто ты ее завел неявно. А неявное всегда хуже явного. Ничего подобного Это взгляд завзятого сишника, которому нужно забраться в коде в печенки каждой абстракции. На самом деле их нужно просто использовать. |
|
Сообщ.
#3057
,
|
|
|
|
Цитата Romkin @ Помнится тут дельфисты интересовались, как выглядит внутри конструктор в C++, чуть не на уровне машинных кодов. И что-то там еще разного говорили про важность поковыряться в исходниках библиотек, чтобы в частности быть уверенным в том, в каком порядке вызываются конструкторы и вызываются ли они вообще. Это взгляд завзятого сишника, которому нужно забраться в коде в печенки каждой абстракции |
|
Сообщ.
#3058
,
|
|
|
|
Цитата Flex Ferrum @ Чувствуешь разницу? ![]() Да. Я уже говорил, что этот случай не учитывал. |
|
Сообщ.
#3059
,
|
|
|
|
Цитата trainer @ Помнится тут дельфисты интересовались, как выглядит внутри конструктор в C++, чуть не на уровне машинных кодов. И что-то там еще разного говорили про важность поковыряться в исходниках библиотек, чтобы в частности быть уверенным в том, в каком порядке вызываются конструкторы и вызываются ли они вообще. Дык это как раз интересно, мы любопытные. Где этот код и как выглядит ![]() Дело в том, что в Delphi этот код в стандартной библиотеке, и при желании его можно найти, всю магию компилятора. В документации-то описано как должно быть, без кода и соображений по скорости работы. Насчет важности такого ковыряния ничего не скажу, но сам факт что это есть и можно своими глазками посмотреть интересен. |
|
Сообщ.
#3060
,
|
|
|
|
Цитата MyNameIsIgor @ Цитата D_KEY @ На мой взгляд, использование рефлексии для обхода инкапсуляции такой же "хак", пусть и разрешенный формально в языке. Мне не понятно, зачем такая возможность вообще существует. Нет, конечно, запреты только сужают возможности. Но зачем вообще может понадобиться изменение приватных полей? Изменения? Не знаю. Но может быть для чего-то и пригодится. Доступ к ним непосредственно на чтение может понадобится например для автоматического модульного тестирования. В любом случае, не нравится - не используй. |