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

    Собственно, вброс и был навеян этим обсуждением. С++ такой логичный :) Ну и, кончено же, всегда можно сказать :
    Цитата MyNameIsIgor @
    Ничего криминального не вижу - это просто надо знать.
      Цитата DesweR @
      То есть?

      ExpandedWrap disabled
        [TestFixture]
        class Test
        {
            struct MyStruct
            {
                // Переопределяем неявно унаследованный ToString()
                public override String ToString()
                {
                    return "Hello";
                }
            }
         
            [Test]
            public void Ts()
            {
                var value = new MyStruct();
                // Все структуры неявно наследуют ValueType.
                //
                Assert.That(value is ValueType, Is.True);
                Assert.That(value is Object, Is.True);
         
                // Пакуем.
                // По сути как в примере Flex Ferrum  пользуемся ссылкой.
                ValueType valueType = value;
                Assert.That(valueType.ToString(), Is.EqualTo("Hello"));
         
                // Пример IL_Agent не релаизуется в C# потому, что запрещены иерархии структур.
            }
        }

      В ногу выстрелить не дадут.

      Добавлено
      А, нет, вру! :lol:

      ExpandedWrap disabled
                struct Base
            {
                public override String ToString()
                {
                    return "Base";
                }
            }
         
                [Test]
            public void StructPolymorphism()
            {
                Base value = new Derivative();
                Assert.That(value.ToString(), Is.EqualTo("Base"));
         
            }

      IL_Agent, C# тоже выводит "Base" ;)
      Сообщение отредактировано: Red -
        Цитата IL_Agent @
        Собственно, вброс и был навеян этим обсуждением. С++ такой логичный :) Ну и, кончено же, всегда можно сказать :

        При использовании аргументов по значению происходит копирование. Чего уж тут нелогичного-то?
          Red
          Всё равно не понял (речь о классах или структурах?), т.е. вот такое на C# неужели не сработает?
          ExpandedWrap disabled
            type
              TBase = class
              public
                procedure Method; virtual;
              end;
             
              TDerive = class(TBase)
              public
                procedure Method; override;
              end;
             
             
            procedure TBase.Method;
            begin
              ShowMessage('TBase');
            end;
             
            procedure TDerive.Method;
            begin
              ShowMessage('TDerive');
            end;
             
             
            procedure Func(B: TBase);
            begin
              B.Method;
            end;
             
            var
              D: TDerive;
            begin
              D := TDerive.Create;
              Func(D);
            end;

          ExpandedWrap disabled
            TDerive
            Цитата Red @
            Assert.That(value.ToString(), Is.EqualTo("Base"));

            Ужас какой :)
              Цитата Red @
                      Assert.That(value is ValueType, Is.True);
                      Assert.That(value is Object, Is.True);

              Кстати, тут ассерты для красоты или?
                Цитата korvin @
                семантика не та, нет в яве такой семантики, чтобы при передаче экземпляра Derived в Func(Base), вызывался Base.method

                Гля... Так в том то и дело, что в Java передаётся не экземпляр, а ссылка на экземпляр. В плюсах передача по ссылке указывается явно.
                Цитата IL_Agent @
                С++ такой логичный

                Да, логичный. То, что плюсы не соответствуют вашим представлениям о синтаксисе, не говорит, что он нелогичный.
                Вот вы, собственно, с чего решили, что написав
                ExpandedWrap disabled
                  void Func(Base b)

                вы будете работать с наследником Base? Где вы об этом прочитали? С чего вы это взяли?
                Вы с какого-то перепугу (не иначе большая собака рядом стояла) решили, что синтаксис должен совпадать с сисярпом. Вот и всё, что было.
                А что эта запись в шарпе ближе скорее к плюсовому
                ExpandedWrap disabled
                  void Func(Base& b)

                вы знать не хотите - вот и вся проблема.
                  Цитата Мяут-Настоящий @
                  Цитата Red @
                  Assert.That(value.ToString(), Is.EqualTo("Base"));

                  Ужас какой :)

                  В MSDN Magazine попадалась статья, где модульные тесты используют для исследования чего-то нового. Отличная идея! Гораздо удобнее вывода в консоль или выполнения под отладчиком.

                  Если ты про то, как это выглядит синтаксически - так ведь же конструкция и звучит как предложение на английском. Assert that value is equal to "Base". В этом как раз весь смысл.

                  Добавлено
                  Цитата DesweR @
                  Цитата Red @
                          Assert.That(value is ValueType, Is.True);
                          Assert.That(value is Object, Is.True);

                  Кстати, тут ассерты для красоты или?

                  Скрытый текст
                  Цитата
                  Сначала убедимся, что все мы на одной странице, и двинемся дальше. Давайте подойдем к MongoDB несколько более структурированно, чем в предыдущей статье (msdn.microsoft.com/magazine/ee310029). Вместо того чтобы просто написать элементарное приложение и забавляться с ним, убьем двух зайцев одним выстрелом и создадим исследовательские тесты: сегменты кода, похожие на модульные тесты, но позволяющие изучать функциональность, а не пытаться тестировать ее.

                  Написание исследовательских тестов служит нескольким целям при изучении новой технологии. Во-первых, эти тесты помогают выяснить, присуща ли изучаемой технологии поддержка тестирования (если ее трудно тестировать в целях изучения, то же самое будет и при модульном тестировании — огромный красный флаг). Во-вторых, они служат своего рода регрессионными тестами в случае выпуска новой версии существующей технологии, так как позволяют заблаговременно узнать, что старая функциональность больше не работает. И в-третьих, поскольку тесты должны быть компактными и гранулярными, исследовательские тесты по самой своей природе облегчают изучение технологии за счет создания новых случаев «что если», которые строятся на основе предыдущих случаев.

                  В отличие от модульных тестов исследовательские не разрабатываются непрерывно в процессе создания приложения, поэтому, как только вы изучили технологию, отложите эти тесты. Но не выбрасывайте их — они способны помочь в отделении ошибок приложения от ошибок в библиотеке или инфраструктуре. Это достигается тем, что такие тесты создают облегченную и нейтральную к приложению среду для экспериментов, свободную от генерируемых приложением издержек.

                  http://msdn.microsoft.com/ru-ru/magazine/ff714592.aspx

                  Вот эта идея мне очень понравилась!
                  Сообщение отредактировано: Red -
                    Поведение указано IL_Agent'ом можно запретить используя явный конструктор копирования:
                    ExpandedWrap disabled
                      #include<iostream>
                       
                      class Base
                      {
                      public:
                          Base() {}
                          explicit Base(const Base& b) {}
                          virtual void Method()
                          { std::cout<<"Base\n"; }
                      };
                       
                      class Derive:public Base
                      {
                      public:
                          Derive() {}
                          explicit Derive(const Derive& b) {}
                          void Method() { std::cout<<"Derive\n"; }
                      };
                       
                      void f(Base b)
                      {
                          b.Method();
                      }
                       
                      void g(Base& b)
                      {
                          b.Method();
                      }
                       
                      int main()
                      {
                          Derive d;
                          Base b(d);  // OK
                          // f(b);    // Error
                          g(b);       // OK
                          g(d);       // OK
                      }
                    Сообщение отредактировано: Мяут-Настоящий -
                      Цитата MyNameIsIgor @
                      Так в том то и дело, что в Java передаётся не экземпляр, а ссылка на экземпляр. В плюсах передача по ссылке указывается явно.

                      нет же, способ передачи совсем не причем, а причем система типов
                        Цитата korvin @
                        нет же, способ передачи совсем не причем, а причем система типов

                        Какое отношение передача параметров имеет к системе типов? :)
                          Red
                          А что касательно моего примера в C#?
                            Прочитал на днях книжку по яве. Там про разницу передачи ссылочных и объектных типов трижды упоминается специально (в общем обзоре, конкретно при изучении классов и в краткой теории ООП с т.з. явы) и много-много раз в сносках и комментариях к коду, как бы напоминается. Наверное это от того, что мешанина из ссылочных и объектных типов настолько очевидна и логична. :yes:
                              Цитата Red @
                              Поведение указано IL_Agent'ом можно запретить используя явный конструктор копирования

                              Да там надо сначала сделать виртуальный деструктор у базового класса, а копирование, по-хорошему, вообще надо запретить...
                              Цитата korvin @
                              нет же, способ передачи совсем не причем, а причем система типов

                              Разверните мысль, пока что я не вижу никакого участия системы типов. Я вижу только различия в передачи ссылки и значения.

                              Добавлено
                              Цитата Повстанець @
                              Прочитал на днях книжку по яве. Там про разницу передачи ссылочных и объектных типов трижды упоминается специально (в общем обзоре, конкретно при изучении классов и в краткой теории ООП с т.з. явы) и много-много раз в сносках и комментариях к коду, как бы напоминается. Наверное это от того, что мешанина из ссылочных и объектных типов настолько очевидна и логична.:yes:

                              Во-во. И квалификатор ref в шарпе, наверное, тоже существует от абсолютной логичности смешения разной семантики одинакового синтаксиса :D
                                Цитата MyNameIsIgor @
                                Да, логичный. То, что плюсы не соответствуют вашим представлениям о синтаксисе, не говорит, что он нелогичный.

                                Речь не о синтаксисе, а о семантике, korvin уже писал же. Компилятор проглотил мой пример и не поперхнулся. Значит синтаксически я написал всё верно. И это не мои представления - это здравый смысл.

                                Цитата MyNameIsIgor @
                                Вот вы, собственно, с чего решили, что написав
                                void Func(Base b)
                                вы будете работать с наследником Base?

                                Ну а для чего я тогда иерархию строил, метод виртуальным объявлял ? И почему он вместо полиморфизма молча делает приведение типа, хотя я никаких операторов приведения не определял ?

                                Цитата MyNameIsIgor @
                                А что эта запись в шарпе ближе скорее к плюсовому
                                void Func(Base& b)
                                вы знать не хотите - вот и вся проблема.

                                Я это знаю. Проблема в том, что это грабли, на которые даже знающий человек может наступить.
                                Сообщение отредактировано: IL_Agent -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 178 179 [180] 181 182 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.3034 ]   [ 15 queries used ]   [ Generated: 31.07.26, 21:05 GMT ]