На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 33 34 [35] 36 37 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    Цитата D_KEY @
    С каких пор модули стали открытыми?

    эээ в каком смысле? ты про определение сущностей вне неймспейса:
    ExpandedWrap disabled
      namespace Foo {
          BlaBla;
          ...
      };
       
      void Foo::Bar () {}

    ? ну эт уже особенности плюсов (и немного джавы)

    Добавлено
    Цитата MyNameIsIgor @
    Поэтому попрошу пояснения: какие функции модулей выполняют дотнетовские сборки?

    я не знаю какие вообще функции они выполняют, почитаю -- отвечу.

    Добавлено
    Цитата D_KEY @
    Не нравится одна абстракция - построй другую. Зачем менять синтаксис?

    затем, что это может быть удобно

    Цитата D_KEY @
    Кстати, модули Delphi тут мало помогут.

    ну тут вообще не каждый язык поможет, это лишь пример, что можно сделать с модулями. и для модуля это нормально, а для класса уже не очень. а в юнитах делфи мне много что не нравится, но сишноплюсовые хидеры нравятся еще меньше =)
    Сообщение отредактировано: korvin -
      Цитата korvin @
      Цитата D_KEY @
      С каких пор модули стали открытыми?

      эээ в каком смысле? ты про определение сущностей вне неймспейса:
      ExpandedWrap disabled
        namespace Foo {
            BlaBla;
            ...
        };
         
        void Foo::Bar () {}

      ? ну эт уже особенности плюсов (и немного джавы)

      Нет, я о том, что пространства имен открыты и в них можно добавлять что-либо в любой момент времени и из разных единиц трансляции.

      Добавлено
      Цитата korvin @
      Цитата D_KEY @
      Не нравится одна абстракция - построй другую. Зачем менять синтаксис?

      затем, что это может быть удобно

      Удобно для тебя, а для читателей и тех, кто будет модифицировать и поддерживать код - не очень.

      Цитата
      Цитата D_KEY @
      Кстати, модули Delphi тут мало помогут.

      ну тут вообще не каждый язык поможет, это лишь пример, что можно сделать с модулями. и для модуля это нормально, а для класса уже не очень. а в юнитах делфи мне много что не нравится, но сишноплюсовые хидеры нравятся еще меньше =)

      Еще раз тебе объясняю, что хидеры и вообще исходные файлы - это не то, о чем следует постоянно думать, ибо логику определяют объекты, классы и неймспейсы.
        Цитата korvin @
        компилятор просто не позволит повторно "подключить" один и тот же модуль, в отличие от C/C++, где все просто надеются, что никто не забудет поставить #pragma once
        Иногда требуется повторное включение заголовочного файла, соответственно стражи/pragma once в таких файлах не ставятся.
          Цитата trainer @
          Иногда требуется повторное включение заголовочного файла, соответственно стражи/pragma once в таких файлах не ставятся.

          хм, зачем?
            Ну как пример - файлы pshpackx.h и poppack.h, содержащие в себе соответственно #pragma pack(push,x) и #pragma pack(pop) или их эквиваленты для указания выравнивания данных.
            Другой вариант - файлы, содержащие повторяющиеся части.

            pshpack1.h из MSVC/BCC:
            ExpandedWrap disabled
              #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))
            он же из GCC(MinGW):
            ExpandedWrap disabled
              #ifndef RC_INVOKED
              #pragma pack(push,1)
              #endif


            Соответственно используются они так:
            ExpandedWrap disabled
              #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>
            Сообщение отредактировано: trainer -
              А еще меня в C# добивает одна вещь: отсутствие нормальных индексных свойств :wall: Да и вообще свойства явно не доработаны. А если я хочу виртуальный геттер/сеттер, мне что, застрелиться?
                Цитата --Ins-- @
                А если я хочу виртуальный геттер/сеттер, мне что, застрелиться?

                Почему? Разве там нет virtual'свойств? Или просто дернуть виртуальный метод из get/set. Не работает?
                  Цитата D_KEY @
                  Почему? Разве там нет virtual'свойств?

                  Есть. Нельзя сделать отдельно виртуальным геттер/сеттер. Только на кой это надо - хз.
                  Цитата --Ins-- @
                  А еще меня в C# добивает одна вещь: отсутствие нормальных индексных свойств

                  А нормальные - это какие?
                    Цитата MyNameIsIgor @
                    Есть.


                    Может я что-то упустил, покажи как?

                    Цитата D_KEY @
                    Или просто дернуть виртуальный метод из get/set.


                    А не через Жо ли это? Тем самым я сделаю тупо два метода, один будет называться GetMyProp и будет виртуальным, а второй - get_MyProp, который не будет виртуальным а будет просто тупо вызывать первый. А одним никак нельзя обойтись?

                    Цитата MyNameIsIgor @
                    А нормальные - это какие?


                    Нормальные свойства - это как в Delphi. Например:
                    ExpandedWrap disabled
                      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;
                      Цитата --Ins-- @
                      Может я что-то упустил, покажи как?

                      Так.
                      Цитата --Ins-- @
                      А не через Жо ли это? Тем самым я сделаю тупо два метода, один будет называться GetMyProp и будет виртуальным, а второй - get_MyProp, который не будет виртуальным а будет просто тупо вызывать первый. А одним никак нельзя обойтись?

                      Не понял сути претензий. Есть виртуальный метод и его вызов в теле геттера/сеттера
                      ExpandedWrap disabled
                        public int Property
                        {
                         get { return GetMethod(); }
                         set { SetMethod(value); }
                        }

                      Цитата --Ins-- @
                      Нормальные свойства - это как в Delphi. Например:

                      Всё офигенно "понятно"...
                      Перегрузка индексатора есть. А по поводу индексатора, не поддающегося перегрузке, я не понял - а каков синтаксис его использования? Если так
                      ExpandedWrap disabled
                        f.Points[10];
                        f.Rects[10];

                      то просто делаются два класса, экземпляры которых возвращаются свойствами Points и Rects соответственно. Данные классы имеют индексаторы - вот и всё.
                      Сообщение отредактировано: MyNameIsIgor -
                        Цитата MyNameIsIgor @
                        Так.


                        Понятно, в принципе в простейшем случае пойдет.

                        Цитата MyNameIsIgor @
                        Не понял сути претензий.


                        Странно что не понял. Еще раз: get/set порождают метод. Плюс ты сам тоже порождаешь метод. В результате у тебя для доступа к значнию свойства вызывается ДВА метода. Может это и не так страшно, но вот то, что два метода в интерфейсе класса - это уже хуже.

                        Цитата MyNameIsIgor @
                        Всё офигенно "понятно"...


                        По пунктам
                        1. Я могу объявить два-три-десять индексных свойств. Что мешало сделать точно так же в C#? Тут ничего сверхсложного нет, просто дайте индексному свойству ИМЯ! Элементарно.
                        2. А свойство с двумя/тремя индексами можно?
                        3. А свойство не с целочисленным индексом можно?
                        4. А единый геттер/сеттер для разных свойств можно? Это порой очень удобно. Не нужно плодить кучу методов. В моем примере вместо восьми методов - только два - Get(Set)Position, у которого index передается парметром. Если я обращаюсь к свойству Left в параметре index передасться 0, Top - единица и т.д. А реализую я метод GetPosition к примеру так:
                        ExpandedWrap disabled
                          Result := FPositions[Index]; // FPositions - например массив

                        Насколько удобнее, правда?

                        Цитата MyNameIsIgor @
                        то просто делаются два класса


                        Еще один костыль. Класс тут нафиг не нужен, это усложняет код. Класс, функция которого доступ к свойству? :D Очень нужный класс :D Если у тебя 10 свойств, ты 10 классов еще породишь? Итого у тебя 11 классов, а у меня - один, кто раньше запутается? И все из-за того, что у свойств просто нет имени. Плюс экземпляр класса еще создать нужно, во время выполнения лишнее действие.

                        В общем, сырое недоделанное фуфло эти ваши индексные свойства, применимы только в простейших случаях, в более сложных требуют необоснеованного изврата. В Delphi они куда более практичны и функциональны. Уже б хотя бы переняли.
                          я вообще не очень понимаю, зачем нужны свойства, есть публичные методы -- интерфейс объекта, свойства-то зачем?
                            Цитата --Ins-- @
                            Понятно, в принципе в простейшем случае пойдет.

                            :lool:
                            Цитата --Ins-- @
                            Странно что не понял. Еще раз: get/set порождают метод. Плюс ты сам тоже порождаешь метод. В результате у тебя для доступа к значнию свойства вызывается ДВА метода. Может это и не так страшно, но вот то, что два метода в интерфейсе класса - это уже хуже.

                            Ага, конечно, а
                            ExpandedWrap disabled
                              property Left: Integer read GetPosition write SetPosition index 0;

                            не порождает метод, единственная задача которого - вызов GetPosition/SetPosition :lool:
                            Чем это проще, чем явная запись?
                            ExpandedWrap disabled
                              public int Property
                              {
                               get { return GetMethod(); }
                               set { SetMethod(value); }
                              }

                            Цитата --Ins-- @
                            1. Я могу объявить два-три-десять индексных свойств. Что мешало сделать точно так же в C#?

                            Цитата --Ins-- @
                            2. А свойство с двумя/тремя индексами можно?

                            Цитата --Ins-- @
                            3. А свойство не с целочисленным индексом можно?

                            Я ещё раз повторяю: перегрузка есть. Т.е. вот это
                            ExpandedWrap disabled
                                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 к примеру так:

                            Ну, так же и написать явно
                            ExpandedWrap disabled
                              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 классов, а у меня - один, кто раньше запутается? И все из-за того, что у свойств просто нет имени. Плюс экземпляр класса еще создать нужно, во время выполнения лишнее действие.

                            Пфффф... Т.е. пользователю надо именно индексаторы вызывать? Просто вызвать
                            ExpandedWrap disabled
                              f.Points(10);
                              f.Rects(10);

                            ему религия не позволяет?
                            Цитата --Ins-- @
                            В общем, сырое недоделанное фуфло эти ваши индексные свойства, применимы только в простейших случаях, в более сложных требуют необоснеованного изврата. В Delphi они куда более практичны и функциональны. Уже б хотя бы переняли.

                            Не, данный вброс говнеца даже не звучит :yes:
                              Очень стрёмная какая то фича эти свойства. Где это виданно -- чтобы полям класса доступ открывать. Хотя если считать их синтаксическим сахаром для замены пары методов для установки простейших состояний каких нить, то вполне даже с пивом потянет. А индексные свойства -- то вообще что то дикое. Если класс имеет композитную сущность, итераторы же есть. Намного логичнее и понятнее. А учитывая, что для их использования не нужен прямой доступ к объекту ещё и удобнее при проектировании. И при обобщённом программировании.
                                Цитата korvin @
                                я вообще не очень понимаю, зачем нужны свойства, есть публичные методы -- интерфейс объекта, свойства-то зачем?

                                Тупо синтаксический сахар. Т.е. вся эта пляска вокруг свойств - измерение пиписьками.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 33 34 [35] 36 37 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.1354 ]   [ 15 queries used ]   [ Generated: 29.07.26, 02:44 GMT ]