Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 37 38 [39] 40 41 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#571
,
|
|
|
|
Цитата D_KEY @ То, что мы получим ссылку на объект(ведь так?), а не копию. Кстати, сможем ли мы поменять состояние это объекта через вызов метода? Если да, то о какой инкапсуляции может идти речь? если мы возвращаем объект, интерфейс которого предполагает изменение его полей, то почему на это должен влиять объект-контейнер? поведение возвращаемого объекта не должно зависеть от контейнера. как спроектировали контейнер, так он и работает |
|
Сообщ.
#572
,
|
|
|
|
Как то так:
![]() ![]() type TPoint = class public: X, Y: Integer; end; TRect = class private _point: TPoint; function GetPoint(): TPoint; procedure SetPoint(Value: TPoint); public property Point: TPoint read GetPoint write SetPoint; end; function TRect.GetPoint(Integer): TPoint; begin Result := _point; end; procedure TRect.SetPoint(Value: TPoint); begin _point := Value; end; ... my_point: TRect; my_point.Point.x := 10; Writeln(my_point.Point.x); |
|
Сообщ.
#573
,
|
|
|
|
|
Сообщ.
#574
,
|
|
|
|
В обход сеттера поменяли состояние внутреннего поля. Объясняю на С++, без всякого сахара для свойств. ![]() ![]() class MyClass { public: const string &GetName() const; void SetName(const string &name); }; Я получаю имя по ссылке, но не могу поменять его. У вас же будет можно, например, добавить символ к имени, если string - класс. string тут для примера, важен сам факт. |
|
Сообщ.
#575
,
|
|
|
|
Цитата Повстанець @ Собственно, что выведется на консоль? 10 |
|
Сообщ.
#576
,
|
|
|
|
Цитата --Ins-- @ Что такое Point.X? Это временный объект? Нет, это переменная с именем point типа Point. |
|
Сообщ.
#577
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ То, что мы получим ссылку на объект(ведь так?), а не копию. Кстати, сможем ли мы поменять состояние это объекта через вызов метода? Если да, то о какой инкапсуляции может идти речь? если мы возвращаем объект, интерфейс которого предполагает изменение его полей, то почему на это должен влиять объект-контейнер? поведение возвращаемого объекта не должно зависеть от контейнера. как спроектировали контейнер, так он и работает Какой контейнер ? Речь идет об атрибутах объекта, определяющих его состояние. |
|
Сообщ.
#578
,
|
|
|
|
Цитата D_KEY @ Объясняю на С++, без всякого сахара для свойств. ![]() ![]() class MyClass { public: const string &GetName() const; void SetName(const string &name); }; Я получаю имя по ссылке, но не могу поменять его. У вас же будет можно, например, добавить символ к имени, если string - класс. string тут для примера, важен сам факт. потому что ты возвращаешь значение не типа string, а типа const string =) |
|
Сообщ.
#579
,
|
|
|
|
Цитата korvin @ потому что ты возвращаешь значение не типа string, а типа const string =) Дык в дельфи, если это класс, то ссылка на экземпляр и отдаётся. Только в дельфи нет const, потому жопа... |
|
Сообщ.
#580
,
|
|
|
|
Цитата D_KEY @ В обход сеттера поменяли состояние внутреннего поля. Еще раз, ты разницу между: понимаешь? Как сеттер ActiveControl во втором случае-то должен участвовать? Ссылочные типы и размерные типы здесь себя ведут по-разному. Сеттер ссылочного типа принимает параметром ссылку, а сеттер типа-значения - значение. |
|
Сообщ.
#581
,
|
|
|
|
Цитата D_KEY @ Какой контейнер ? Речь идет об атрибутах объекта, определяющих его состояние.как это какой? в твоем же примере MyClass -- контейнер, string name -- объект типа с изменяемым интерфейсом, но ты геттером возвращаешь объект типа const string, поэтому изменить name извне не получается |
|
Сообщ.
#582
,
|
|
|
|
Цитата --Ins-- @ Цитата Повстанець @ Собственно, что выведется на консоль? 10 А как же инкапсуляция? Вот так взяли и поменяли свойство, не спросив у объекта. Я хотя бы могу как-то вернуть копию объекта(так, чтобы клиенту не пришлось ее явно удалять)? Или это невозможно в принципе? Добавлено Цитата korvin @ Цитата D_KEY @ Объясняю на С++, без всякого сахара для свойств. ![]() ![]() class MyClass { public: const string &GetName() const; void SetName(const string &name); }; Я получаю имя по ссылке, но не могу поменять его. У вас же будет можно, например, добавить символ к имени, если string - класс. string тут для примера, важен сам факт. потому что ты возвращаешь значение не типа string, а типа const string =) Нет, я возвращаю значение типа const string & |
|
Сообщ.
#583
,
|
|
|
|
Цитата --Ins-- @ понимаешь? Как сеттер ActiveControl во втором случае-то должен участвовать? Ссылочные типы и размерные типы здесь себя ведут по-разному. Сеттер ссылочного типа принимает параметром ссылку, а сеттер типа-значения - значение. Только вот Form нифига не в курсе, что её ActiveControl изменился. В результате накручивают ещё усложнение - свойства с уведомлениями, мы на них подписываемся, получаем сообщения хз откуда, короче, имеет только страшную головную боль вместо того, чтобы цивильно юзать методы, которые говорят "я посылаю тебе сообщение". |
|
Сообщ.
#584
,
|
|
|
|
Цитата D_KEY @ А как же инкапсуляция? Вот так взяли и поменяли свойство, не спросив у объекта. Еще как спросив Только того объекта, чье свойство устанавливается, а это - объект Point, а не Rect |
|
Сообщ.
#585
,
|
|
|
|
Цитата --Ins-- @ Цитата D_KEY @ В обход сеттера поменяли состояние внутреннего поля. Еще раз, ты разницу между: понимаешь? Как сеттер ActiveControl во втором случае-то должен участвовать? --Ins--, я прекрасно понимаю что происходит. Я не понимаю, зачем это происходит именно так. Цитата Ссылочные типы и размерные типы здесь себя ведут по-разному. Сеттер ссылочного типа принимает параметром ссылку, а сеттер типа-значения - значение. Да, и это мне не нравится |