Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 295 296 [297] 298 299 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#4441
,
|
|
|
|
знаю, а не в триалке тексты Firemonkey открыты? |
|
Сообщ.
#4442
,
|
|
|
|
Цитата Flex Ferrum @ Вот ты мне скажи - ты мало видел примеров говнодизайна публичных интерфейсов без использования свойств? Злоупотреблять можно всем и везде. То, что ножом можно порезаться - это не повод делать его тупым. ![]() Так стоит ли овчинка выделки? Ну не было бы у тебя свойства поверх метода получения списка и что? |
|
Сообщ.
#4443
,
|
|
|
|
Цитата D_KEY @ Так стоит ли овчинка выделки? "Цена удобства". В ту же тему:![]() ![]() class SurfaceMap { public: property size_t ColsCount {get {return m_Cells.чего-то-там();}} property size_t RowsCount {get {return m_Cells.чего-то-там-другое();}} property SurfaceCell& Cells(int row, int col) {get {return m_Cells[row][col];}} private: boost::multi_index<SurfaceCell, 2> m_Cells; }; // ... SurfaceMap map(10, 10); assert(map.ColsCount == 10); assert(map.RowsCount == 10); map.Cells[5][7].TerrinType = Terrain::BlueGrass; |
|
Сообщ.
#4444
,
|
|
|
|
Ага, всё таки их к VS да и Qt прикручивали не интереса ради |
|
Сообщ.
#4445
,
|
|
|
|
Альтернативный вариант:
![]() ![]() // 1 SurfaceMap map(10, 10); assert(map.ColsCount == 10); assert(map.RowsCount == 10); map.Cells[5][7].TerrinType = Terrain::BlueGrass; // 2 SurfaceMap map(10, 10); assert(map.GetColsCount() == 10); assert(map.GetRowsCount() == 10); map.GetCell(5, 7).SetTerrinType(Terrain::BlueGrass); |
|
Сообщ.
#4446
,
|
|
|
|
Цитата DesweR @ знаю, а не в триалке тексты Firemonkey открыты? Вообще должны быть, никаких причин закрывать нет. Цитата D_KEY @ Так стоит ли овчинка выделки? Ну не было бы у тебя свойства поверх метода получения списка и что? Если свойства сделаны хорошо - стоит. Если просто свойства как обертка над геттером и сеттером, то понятно что сахар. Но в Delphi с ними еще и RTTI работает, а это значит, что они участвуют в персистентности и рефлексии. Именно из-за наличия механизма свойств не нужно где-то дополнительно описывать работу с редактором, сохранение, позднее связывание. |
|
Сообщ.
#4447
,
|
|
|
|
Flex Ferrum
А что-нибудь такое? ![]() ![]() TRectangle = class private FCoordinates: array[0..3] of Longint; function GetCoordinate(Index: Integer): Longint; procedure SetCoordinate(Index: Integer; Value: Longint); public property Left: Longint index 0 read GetCoordinate write SetCoordinate; property Top: Longint index 1 read GetCoordinate write SetCoordinate; property Right: Longint index 2 read GetCoordinate write SetCoordinate; property Bottom: Longint index 3 read GetCoordinate write SetCoordinate; property Coordinates[Index: Integer]: Longint read GetCoordinate write SetCoordinate; end; Добавлено Цитата Romkin @ Если просто свойства как обертка над геттером и сеттером, то понятно правила хорошего тона. fixed |
|
Сообщ.
#4448
,
|
|
|
|
Цитата DesweR @ "Свойства" обеспечивают управление доступом к внутреннему состоянию объекта и тривиальной связкой методов "читать/писать", как ты полагаешь, они не ограничиваются. да не нужен никакой "доступ к внутреннему состоянию", на то оно и внутреннее Цитата DesweR @ ![]() ![]() TAncestor = class private FCaption: string; FLength: Integer; protected property Caption: string read FCaption; property Length: Integer read FLength; end; TDerived1 = class(TAncestor) public property Caption; property Length; end; здорово, вот так взяли и изменили область видимости свойств базового класса. |
|
Сообщ.
#4449
,
|
|
|
|
Цитата DesweR @ Flex Ferrum А что-нибудь такое? Ну, шарп (ЕМНИП) такого не поддерживает. Моя реализация свойств - могёт. А что-нибуть такое: ![]() ![]() class IUnit { public: PROPERTIES(IUnit, // В интерфейсе объявляем набор RO-свойств ABSTRACT_RO_PROPERTY(IWizard*, Owner) ABSTRACT_RO_PROPERTY(IRace*, Race) ABSTRACT_RO_PROPERTY(StatsTuple&, Stats) ); }; class Unit : public IUnit { public: PROPERTIES(Unit, // Имплементируем их как R/W-свойства IMPLEMENT_PROPERTY(IUnit, PROPERTY(IWizard*, Owner)) IMPLEMENT_PROPERTY(IUnit, PROPERTY(IRace*, Race)) IMPLEMENT_PROPERTY(IUnit, PROPERTY(StatsTuple&, Stats)) ); }; Таким образом получаем, что внешние клиенты системы работают с ReadOnly-свойствами. А внутри системы требования менее жёсткие, и те же самые свойства можно ещё и писать. Интерфейс непрозрачен. Т. е. перейти от него к реализации - нельзя... |
|
Сообщ.
#4450
,
|
|
|
|
Цитата korvin @ здорово, вот так взяли и изменили область видимости свойств базового класса. И что, это ужас-ужас? А что, методы в потомках в паблик не перемещают? |
|
Сообщ.
#4451
,
|
|
|
|
Цитата DesweR @ ![]() ![]() TDerived4 = class(TDerived3) private procedure SetLength(const ALength: Integer); public property Caption write FCaption; property Length write SetLength; end; доступ к приватному полю базового класса тоже доставляет, да... |
|
Сообщ.
#4452
,
|
|
|
|
Цитата korvin @ доступ к приватному полю базового класса тоже доставляет, да... Доступ через метод. Какие проблемы-то собственно? Ну да, я понимаю, приватные поля вообще не должны никак изменяться снаружи, ни методами ни опосредованно. Ибо приват |
|
Сообщ.
#4453
,
|
|
|
|
Цитата korvin @ доступ к приватному полю базового класса тоже доставляет, да... Вот, кстати, доступ к свой базовой части, в принципе, нормален. К другом объекту, через интерфейс базового - нет. Добавлено Сейчас меня, наверно, четвертуют |
|
Сообщ.
#4454
,
|
|
|
|
Цитата D_KEY @ Сейчас меня, наверно, четвертуют ![]() А потом повесят, расстреляют, а остатки - сожгут на костре. |
|
Сообщ.
#4455
,
|
|
|
|
Цитата D_KEY @ Вот, кстати, доступ к свой базовой части, в принципе, нормален. К другом объекту, через интерфейс базового - нет. Хе. А нафига тебе приватные поля, к которым нет доступа вообще? Добавлено Цитата korvin @ Цитата (DesweR @ Сегодня, 08:39) TDerived4 = class(TDerived3) private procedure SetLength(const ALength: Integer); public property Caption write FCaption; property Length write SetLength; end; доступ к приватному полю базового класса тоже доставляет, да... Кстати, доступа тут нет. |