Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 33 34 [35] 36 37 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#511
,
|
|
|
|
эээ в каком смысле? ты про определение сущностей вне неймспейса: ![]() ![]() namespace Foo { BlaBla; ... }; void Foo::Bar () {} ? ну эт уже особенности плюсов (и немного джавы) Добавлено Цитата MyNameIsIgor @ Поэтому попрошу пояснения: какие функции модулей выполняют дотнетовские сборки? я не знаю какие вообще функции они выполняют, почитаю -- отвечу. Добавлено затем, что это может быть удобно ну тут вообще не каждый язык поможет, это лишь пример, что можно сделать с модулями. и для модуля это нормально, а для класса уже не очень. а в юнитах делфи мне много что не нравится, но сишноплюсовые хидеры нравятся еще меньше =) |
|
Сообщ.
#512
,
|
|
|
|
Цитата korvin @ эээ в каком смысле? ты про определение сущностей вне неймспейса: ![]() ![]() namespace Foo { BlaBla; ... }; void Foo::Bar () {} ? ну эт уже особенности плюсов (и немного джавы) Нет, я о том, что пространства имен открыты и в них можно добавлять что-либо в любой момент времени и из разных единиц трансляции. Добавлено Цитата korvin @ затем, что это может быть удобно Удобно для тебя, а для читателей и тех, кто будет модифицировать и поддерживать код - не очень. Цитата ну тут вообще не каждый язык поможет, это лишь пример, что можно сделать с модулями. и для модуля это нормально, а для класса уже не очень. а в юнитах делфи мне много что не нравится, но сишноплюсовые хидеры нравятся еще меньше =) Еще раз тебе объясняю, что хидеры и вообще исходные файлы - это не то, о чем следует постоянно думать, ибо логику определяют объекты, классы и неймспейсы. |
|
Сообщ.
#513
,
|
|
|
|
Цитата korvin @ Иногда требуется повторное включение заголовочного файла, соответственно стражи/pragma once в таких файлах не ставятся. компилятор просто не позволит повторно "подключить" один и тот же модуль, в отличие от C/C++, где все просто надеются, что никто не забудет поставить #pragma once |
|
Сообщ.
#514
,
|
|
|
|
Цитата trainer @ Иногда требуется повторное включение заголовочного файла, соответственно стражи/pragma once в таких файлах не ставятся. хм, зачем? |
|
Сообщ.
#515
,
|
|
|
|
Ну как пример - файлы pshpackx.h и poppack.h, содержащие в себе соответственно #pragma pack(push,x) и #pragma pack(pop) или их эквиваленты для указания выравнивания данных.
Другой вариант - файлы, содержащие повторяющиеся части. pshpack1.h из MSVC/BCC: ![]() ![]() #if ! (defined(lint) || defined(RC_INVOKED)) #if ( _MSC_VER >= 800 && !defined(_M_I86)) || defined(_PUSHPOP_SUPPORTED) #pragma warning(disable:4103) #if !(defined( MIDL_PASS )) || defined( __midl ) #pragma pack(push,1) #else #pragma pack(1) #endif #else #pragma pack(1) #endif #endif // ! (defined(lint) || defined(RC_INVOKED)) ![]() ![]() #ifndef RC_INVOKED #pragma pack(push,1) #endif Соответственно используются они так: ![]() ![]() #include <pshpack1.h> typedef struct { char a; int b; } my_struct; #include <poppack.h> #include <pshpack2.h> typedef struct { char a; int b; } my_struct2; #include <poppack.h> |
|
Сообщ.
#516
,
|
|
|
|
А еще меня в C# добивает одна вещь: отсутствие нормальных индексных свойств
Да и вообще свойства явно не доработаны. А если я хочу виртуальный геттер/сеттер, мне что, застрелиться? |
|
Сообщ.
#517
,
|
|
|
|
Цитата --Ins-- @ А если я хочу виртуальный геттер/сеттер, мне что, застрелиться? Почему? Разве там нет virtual'свойств? Или просто дернуть виртуальный метод из get/set. Не работает? |
|
Сообщ.
#518
,
|
|
|
|
Цитата D_KEY @ Почему? Разве там нет virtual'свойств? Есть. Нельзя сделать отдельно виртуальным геттер/сеттер. Только на кой это надо - хз. Цитата --Ins-- @ А еще меня в C# добивает одна вещь: отсутствие нормальных индексных свойств А нормальные - это какие? |
|
Сообщ.
#519
,
|
|
|
|
Цитата MyNameIsIgor @ Есть. Может я что-то упустил, покажи как? Цитата D_KEY @ Или просто дернуть виртуальный метод из get/set. А не через Жо ли это? Тем самым я сделаю тупо два метода, один будет называться GetMyProp и будет виртуальным, а второй - get_MyProp, который не будет виртуальным а будет просто тупо вызывать первый. А одним никак нельзя обойтись? Цитата MyNameIsIgor @ А нормальные - это какие? Нормальные свойства - это как в Delphi. Например: ![]() ![]() private function GetPosition(Index: Integer): Integer; procedure SetPosition(Index, Value: Integer); function GetNode(Name: String): TNode; procedure SetNode(Name: String; Value: TNode); function GetCell(Col, Row: Integer): String; procedure SetCell(Col, Row: Integer; Value: String); protected // Виртуальные геттеры/сеттеры function GetPoint(Index: Integer): TPoint; virtual; abstract; procedure SetPoint(Index: Integer; Value: TPoint); virtual; abstract; function GetRect(Index: Integer): TRect; virtual; abstract; procedure SetRect(Index: Integer; Value: TRect); virtual; abstract; public property Points[Index: Integer]: TPoint read GetPoint write SetPoint; property Rects[Index: Integer]: TRect read GetRect write SetRect; // Да-да! Второе индексное свойство! property NodeByName[Name: String]: TNode read GetNode write SetNode; // А это свойство с строковым индексом property Cells[Col, Row: Integer]: String read GetCell write SetCell; // Свойство с двумя индексами // Единый геттер/сеттер для разных свойств! property Left: Integer read GetPosition write SetPosition index 0; property Top: Integer read GetPosition write SetPosition index 1; property Right: Integer read GetPosition write SetPosition index 2; property Bottom: Integer read GetPosition write SetPosition index 3; end; |
|
Сообщ.
#520
,
|
|
|
|
Цитата --Ins-- @ Может я что-то упустил, покажи как? Так. Цитата --Ins-- @ А не через Жо ли это? Тем самым я сделаю тупо два метода, один будет называться GetMyProp и будет виртуальным, а второй - get_MyProp, который не будет виртуальным а будет просто тупо вызывать первый. А одним никак нельзя обойтись? Не понял сути претензий. Есть виртуальный метод и его вызов в теле геттера/сеттера ![]() ![]() public int Property { get { return GetMethod(); } set { SetMethod(value); } } Цитата --Ins-- @ Нормальные свойства - это как в Delphi. Например: Всё офигенно "понятно"... Перегрузка индексатора есть. А по поводу индексатора, не поддающегося перегрузке, я не понял - а каков синтаксис его использования? Если так ![]() ![]() f.Points[10]; f.Rects[10]; то просто делаются два класса, экземпляры которых возвращаются свойствами Points и Rects соответственно. Данные классы имеют индексаторы - вот и всё. |
|
Сообщ.
#521
,
|
|
|
|
Цитата MyNameIsIgor @ Так. Понятно, в принципе в простейшем случае пойдет. Цитата MyNameIsIgor @ Не понял сути претензий. Странно что не понял. Еще раз: get/set порождают метод. Плюс ты сам тоже порождаешь метод. В результате у тебя для доступа к значнию свойства вызывается ДВА метода. Может это и не так страшно, но вот то, что два метода в интерфейсе класса - это уже хуже. Цитата MyNameIsIgor @ Всё офигенно "понятно"... По пунктам 1. Я могу объявить два-три-десять индексных свойств. Что мешало сделать точно так же в C#? Тут ничего сверхсложного нет, просто дайте индексному свойству ИМЯ! Элементарно. 2. А свойство с двумя/тремя индексами можно? 3. А свойство не с целочисленным индексом можно? 4. А единый геттер/сеттер для разных свойств можно? Это порой очень удобно. Не нужно плодить кучу методов. В моем примере вместо восьми методов - только два - Get(Set)Position, у которого index передается парметром. Если я обращаюсь к свойству Left в параметре index передасться 0, Top - единица и т.д. А реализую я метод GetPosition к примеру так: ![]() ![]() Result := FPositions[Index]; // FPositions - например массив Насколько удобнее, правда? Цитата MyNameIsIgor @ то просто делаются два класса Еще один костыль. Класс тут нафиг не нужен, это усложняет код. Класс, функция которого доступ к свойству? Очень нужный класс Если у тебя 10 свойств, ты 10 классов еще породишь? Итого у тебя 11 классов, а у меня - один, кто раньше запутается? И все из-за того, что у свойств просто нет имени. Плюс экземпляр класса еще создать нужно, во время выполнения лишнее действие.В общем, сырое недоделанное фуфло эти ваши индексные свойства, применимы только в простейших случаях, в более сложных требуют необоснеованного изврата. В Delphi они куда более практичны и функциональны. Уже б хотя бы переняли. |
|
Сообщ.
#522
,
|
|
|
|
я вообще не очень понимаю, зачем нужны свойства, есть публичные методы -- интерфейс объекта, свойства-то зачем?
|
|
Сообщ.
#523
,
|
|
|
|
Цитата --Ins-- @ Понятно, в принципе в простейшем случае пойдет. ![]() Цитата --Ins-- @ Странно что не понял. Еще раз: get/set порождают метод. Плюс ты сам тоже порождаешь метод. В результате у тебя для доступа к значнию свойства вызывается ДВА метода. Может это и не так страшно, но вот то, что два метода в интерфейсе класса - это уже хуже. Ага, конечно, а ![]() ![]() property Left: Integer read GetPosition write SetPosition index 0; не порождает метод, единственная задача которого - вызов GetPosition/SetPosition ![]() Чем это проще, чем явная запись? ![]() ![]() public int Property { get { return GetMethod(); } set { SetMethod(value); } } Цитата --Ins-- @ 1. Я могу объявить два-три-десять индексных свойств. Что мешало сделать точно так же в C#? Цитата --Ins-- @ 2. А свойство с двумя/тремя индексами можно? Цитата --Ins-- @ 3. А свойство не с целочисленным индексом можно? Я ещё раз повторяю: перегрузка есть. Т.е. вот это ![]() ![]() property NodeByName[Name: String]: TNode read GetNode write SetNode; // А это свойство с строковым индексом property Cells[Col, Row: Integer]: String read GetCell write SetCell; // Свойство с двумя индексами есть. Цитата --Ins-- @ 4. А единый геттер/сеттер для разных свойств можно? Это порой очень удобно. Не нужно плодить кучу методов. В моем примере вместо восьми методов - только два - Get(Set)Position, у которого index передается парметром. Если я обращаюсь к свойству Left в параметре index передасться 0, Top - единица и т.д. А реализую я метод GetPosition к примеру так: Ну, так же и написать явно ![]() ![]() public int Property1 { get { return GetMethod(1); } set { SetMethod(1, value); } } public int Property2 { get { return GetMethod(2); } set { SetMethod(2, value); } } public int Property3 { get { return GetMethod(3); } set { SetMethod(3, value); } } Проблем не вижу. Цитата --Ins-- @ Тут ничего сверхсложного нет, просто дайте индексному свойству ИМЯ! Элементарно. На самом деле индексаторы - нифига не свойства. Это операторы языка. И я ещё раз спрашиваю: как синтаксически вызываются индексаторы, у которых разные имена, но одинаковые параметры? Цитата --Ins-- @ Еще один костыль. Класс тут нафиг не нужен, это усложняет код. Класс, функция которого доступ к свойству? Очень нужный класс Если у тебя 10 свойств, ты 10 классов еще породишь? Итого у тебя 11 классов, а у меня - один, кто раньше запутается? И все из-за того, что у свойств просто нет имени. Плюс экземпляр класса еще создать нужно, во время выполнения лишнее действие. Пфффф... Т.е. пользователю надо именно индексаторы вызывать? Просто вызвать ![]() ![]() f.Points(10); f.Rects(10); ему религия не позволяет? Цитата --Ins-- @ В общем, сырое недоделанное фуфло эти ваши индексные свойства, применимы только в простейших случаях, в более сложных требуют необоснеованного изврата. В Delphi они куда более практичны и функциональны. Уже б хотя бы переняли. Не, данный вброс говнеца даже не звучит |
|
Сообщ.
#524
,
|
|
|
|
Очень стрёмная какая то фича эти свойства. Где это виданно -- чтобы полям класса доступ открывать. Хотя если считать их синтаксическим сахаром для замены пары методов для установки простейших состояний каких нить, то вполне даже с пивом потянет. А индексные свойства -- то вообще что то дикое. Если класс имеет композитную сущность, итераторы же есть. Намного логичнее и понятнее. А учитывая, что для их использования не нужен прямой доступ к объекту ещё и удобнее при проектировании. И при обобщённом программировании.
|
|
Сообщ.
#525
,
|
|
|
|
Цитата korvin @ я вообще не очень понимаю, зачем нужны свойства, есть публичные методы -- интерфейс объекта, свойства-то зачем? Тупо синтаксический сахар. Т.е. вся эта пляска вокруг свойств - измерение пиписьками. |