На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 183 184 [185] 186 187 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    Цитата IL_Agent @
    про написание речь, а не про использование
    Про написание чего?
      А в C# всё-таки требуется обязательное указание ключевого слова ref при передаче ссылки.
      ExpandedWrap disabled
        void Method(ref int i)
        {
        }
        ...
        int val = 1;
        Method(ref val);


      Добавлено
      Цитата trainer @
      Про написание чего?

      Предполагаю, что чего-нибудь аналогично похожего, что есть в бусте.
        Цитата DesweR @
        Предполагаю, что чего-нибудь аналогично похожего, что есть в бусте.
        Ну если оно есть в бусте, значит хотя бы один человек такое уже написал. А если написал один, то понятное дело напишет и второй. Логично ведь... :)
          Цитата MyNameIsIgor @
          Лол? Как это не приводится? Функция получает ссылку на предка

          нет, не получает, она получает ссылку на реализацию (я не зря использовал это слово) Derived, но с интерфейсом Base. При передаче по значению (тут ява да, неудачный пример) также сужается только интерфейс.
            Цитата Flex Ferrum @
            Правильно ли я понимаю, что для полиморфных и неполиморфных типов компилятор должен реализовывать разную семантику? Первые всегда должны быть ссылочные, а вторые - by value. А разработчику (как конечному, так и компилятора) голову не снесёт?

            Вот разработчики Delphi нашли в себе смелость сделать наследуемым ссылочный тип, и не наследуемым структурный, по значению. Отказавшись от старой системы объектов by value.
            Много ты видел дельфистов и шарпистов со снесенными головами? :D И только сишники продолжают цепляться за безнадежно устаревшую систему реализации объектов, при этом утверждая, что все хорошо и так и должно быть, а другие способы - полный отстой.
            Программирование идет на абстракциях, они могут быть удичными или нет. string - абстракция строки, причем в Delphi она на мой взгляд наиболее удачная. В частности, начинающие программисты просто и не догадываются, что это ссылка, а воспринимают это как должно: абстракция строки. То же самое касается и объектов.
            Везде и постоянно говорится, что внутреннее устройство объектов необходимо скрывать, пользователь не должен знать как устроен объект внутри, и использовать это. И только некоторые личности уверяют, что им просто необходимо знать и постоянно указывать как идет работа с объектом, иначе голову снесет.
              Цитата korvin @
              нет, не получает, она получает ссылку на реализацию (я не зря использовал это слово) Derived, но с интерфейсом Base

              Ну, да, это и называется приведением ссылки на потомка к ссылке на предка. Например, C#
              ExpandedWrap disabled
                using System;
                 
                class Base
                {
                  public void foo()
                  {
                    Console.WriteLine("Base");
                  }
                  public virtual void bar()
                  {
                    Console.WriteLine("Base");
                  }
                }
                 
                class Derived : Base
                {
                  public new void foo()
                  {
                    Console.WriteLine("Derived");
                  }
                  public override void bar()
                  {
                    Console.WriteLine("Derived");
                  }
                }
                 
                class Program
                {
                  public static void f(Base b)
                  {
                    b.foo();
                    b.bar();
                  }
                 
                  public static void Main(string[] args)
                  {
                    var d = new Derived();
                    f(d);
                  }
                }

              ExpandedWrap disabled
                Base
                Derived

              Наличие виртуального метода - частность, никак не влияющая на приведение ссылки.
                Цитата Romkin @
                В частности, начинающие программисты просто и не догадываются, что это ссылка, а воспринимают это как должно: абстракция строки.
                Не поверишь! std::string - абстракция строки, не все даже не-начинающие знают, как оно внутри устроено - это просто не нужно. Более того, возможны и наверняка существуют реализации с разным внутренним устройством. Мне лень сравнивать реализации, например, RogueWave и STLPort.

                Добавлено
                Как-то странно выглядит выдача нормы за преимущество Delphi.
                Сообщение отредактировано: trainer -
                  Цитата trainer @
                  Не поверишь! std::string - абстракция строки, не все даже не-начинающие знают, как оно внутри устроено - это просто не нужно.

                  Вот именно. А зачем тогда вам интересно указывать, что это ссылка или нет?

                  Добавлено
                  Цитата trainer @
                  Как-то странно выглядит выдача нормы за преимущество Delphi.

                  Потому что это именно норма. А программисты С++ хотят явного указания, ссылка это или нет. Зачем?
                    Цитата Romkin @
                    А зачем тогда вам интересно указывать, что это ссылка или нет?
                    Так мы при обобщенном программировании и не интересуемся, как оно внутри устроено. Нужно ли создавать руками копию или нет?

                    Добавлено
                    Цитата Romkin @
                    А программисты С++ хотят явного указания, ссылка это или нет. Зачем?
                    Чтобы знать, как с этим работать. Ведь поведение переменной/параметра зависит от типа.
                    Сообщение отредактировано: trainer -
                      Цитата trainer @
                      Так мы при обобщенном программировании и не интересуемся, как оно внутри устроено.
                      Даже больше скажу. Во время написания оно может быть ещё вообще ни как не устроено. :yes: И как будет устроено представлять только в общих чертах.
                        Цитата MyNameIsIgor @
                        Цитата korvin @
                        нет, не получает, она получает ссылку на реализацию (я не зря использовал это слово) Derived, но с интерфейсом Base

                        Ну, да, это и называется приведением ссылки на потомка к ссылке на предка. Например, C#
                        ExpandedWrap disabled
                          using System;
                           
                          class Base
                          {
                            public void foo()
                            {
                              Console.WriteLine("Base");
                            }
                            public virtual void bar()
                            {
                              Console.WriteLine("Base");
                            }
                          }
                           
                          class Derived : Base
                          {
                            public new void foo()
                            {
                              Console.WriteLine("Derived");
                            }
                            public override void bar()
                            {
                              Console.WriteLine("Derived");
                            }
                          }
                           
                          class Program
                          {
                            public static void f(Base b)
                            {
                              b.foo();
                              b.bar();
                            }
                           
                            public static void Main(string[] args)
                            {
                              var d = new Derived();
                              f(d);
                            }
                          }

                        ExpandedWrap disabled
                          Base
                          Derived

                        Наличие виртуального метода - частность, никак не влияющая на приведение ссылки.

                        это называется приведение интерфейса
                        ExpandedWrap disabled
                          class Base {
                            public void method () {
                              System.out.println( "Base" );
                            }
                          }
                           
                          class Derived extends Base {
                            private int = 0;
                            public void setX (int x) {
                              this.x = x;
                            }
                            public void method () {
                              System.out.format( "Derived %s\n", x );
                            }
                          }
                           
                          public class Test {
                            static private Base func (Base x) {
                              x.method();
                              ((Derived) x).setX(4);
                              return x;
                            }
                            static public void main (String[] args) {
                              Derived d = new Derived();
                              
                              d.setX(3);
                              d = (Derived) func(d);
                              d.method();
                            }
                          }

                        ExpandedWrap disabled
                          Derived 3
                          Derived 4

                        как видишь к супертипу приводится только интерфейс (который легко можно привести обратно), реализация не приводится.

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

                          Никогда не слышал понятия "приведение интерфейса". То, что вы показываете, - приведение типа. Тип в данном случае ссылочный. Это в какой-то степени соответствует приведению ссылок в C++ (что тоже является приведение типов).
                            Я о том, что интерфейс оказывается тоже ссылка узнал только когда на IDL описание увидел. В Delphi это знание просто не нужно, так зачем указывать звездочку, если иного не дано? Есть абстракция "объект", на ней определены некоторые действия, которые с ним можно производить. Присваивание (и некоторые другие действия) в их состав не входит. Все. С какой целью знать, что это ссылочный тип? Знать в принципе нужно, но это знание не должно быть необходимым. А в С++ знать отличие ссылки и значения - необходимо, потому что объект там по сути просто набор предков. Из-за этого приходится активно использовать шаблоны.
                            То есть реализация абстракции "объект" в С++ устарела уже лет на десять. Куча языков ушла вперед, абстракции объектов в java, C#, Delphi, Питоне и т.д. намного более удобны, именно как абстракции.
                            В частности, сделана большая работа над тем, чтобы как можно меньше использовать указатели и ссылки, они спрятаны внутри абстракции. И сделано это недаром, тенденция "мы не работаем с указателями" уже совершенно ясна. И выпячивать отсталось С++ в этом вопросе как преимущество - глупо.
                            Причем я уверен, что на практике по значению передаются объекты без виртуальных методов, и по ссылке - с виртуальными. То есть, скорее всего ограничение, которое есть в других языках на уровне языка, в С++ носит организационный характер. Все как обычно, если в других языках ты просто не можешь сделать неправильно, то в С++ - легко и непринужденно, при этом тебе заявляют что сам дурак, так делать не надо в свете последних решений съезда ведущих разработчиков...
                              Цитата trainer @
                              Про написание чего?

                              Цитата DesweR @
                              Предполагаю, что чего-нибудь аналогично похожего, что есть в бусте.

                              Вывод : КО не любит С++ и не подсказывает его сторонникам. :lol:
                              Цитата Повстанець @
                              Ну если оно есть в бусте, значит хотя бы один человек такое уже написал. А если написал один, то понятное дело напишет и второй.

                              ... Но не прочтёт то, что написал первый.
                                Цитата trainer @
                                А программисты С++ хотят явного указания, ссылка это или нет. Зачем?
                                Чтобы знать, как с этим работать. Ведь поведение переменной/параметра зависит от типа.

                                И что? Я тебе объявляю, что для этого типа присвоедине не приводит к появлению копии. Тебе очень интересно, реализовано это через ссылку или еще как? Есть абстракция, есть описанные действия с ней. Тебя не должно интересновать, ссылочный это тип или нет, это - детали реализации. Яркий пример как раз тип string в Delphi. Реализован через ссылку, но при программировании с ним программист это "забывает". Потому что этот факт не нужно знать.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 183 184 [185] 186 187 ...  494 495


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