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

    Добавлено
    Цитата IL_Agent @
    Я это знаю. Проблема в том, что это грабли, на которые даже знающий человек может наступить.
    Грабли, это когда на один синтаксис существует 2 семантики. Вот это действительно надо знать.
      Цитата IL_Agent @
      Речь не о синтаксисе, а о семантике, korvin уже писал же

      Я не увидел ничего стоящего в его словах и пояснил ему глубину его заблуждения.
      Цитата IL_Agent @
      Компилятор проглотил мой пример и не поперхнулся. Значит синтаксически я написал всё верно.

      Синтаксически - да. Но с чего вы взяли, что семантика написанного будет та, которую вы хотите видеть? Ах, да, у вас же
      Цитата IL_Agent @
      здравый смысл

      Вы где этот смысл взяли? Выбросьте немедленно, он какой-то не такой... Правильный здравый смысл велит сначала ознакомиться с инструментом, а потом его использовать.
      Цитата IL_Agent @
      Ну а для чего я тогда иерархию строил, метод виртуальным объявлял ?

      А кто вас знает? Ну, смею надеяться, что анализ предметной области сказал о такой необходимости...
      Цитата IL_Agent @
      И почему он вместо полиморфизма молча делает приведение типа, хотя я никаких операторов приведения не определял ?

      Как это? Ссылка на наследника может быть приведена к ссылке на публичного родителя - это тоже надо знать, ага. В соответствии с этим был вызван конструктор копирования родителя - как вы и написали, передача по значению.
      Что ещё про C++ вам объяснить?
      Цитата IL_Agent @
      Я это знаю. Проблема в том, что это грабли, на которые даже знающий человек может наступить.

      Знающий - не может.
        Цитата IL_Agent @
        то тип перестаёт быть "конкретным" ?

        Если в шарпе вместо
        ExpandedWrap disabled
          class Base
          {
          }
           
          class Derived : Base
          {
          }
           
          class StaticMain
          {
             publiс static void Foo(Base b)
             {
             }
           
             public static void Main()
             {
                Base b = new Derived();
           
                Foo(b);
             }
          }


        Написать (подсвечено красным)
        ExpandedWrap disabled
          class Base
          {
          }
           
          class Derived : Base
          {
          }
           
          class StaticMain
          {
             publiс static void Foo(ref Base b)
             {
             }
           
             public static void Main()
             {
                Base b = new Derived();
           
                Foo(b);
             }
          }

        Тип перестаёт быть конкретным?
          Цитата MyNameIsIgor @
          Я не увидел ничего стоящего в его словах и пояснил ему глубину его заблуждения.

          нет, не пояснил. отличия сугубо семантические. синтаксическими они были бы, если бы, например, в яве нужно было явно описывать передачу по ссылке, но выглядело бы это как
          ExpandedWrap disabled
            void func (ref Base x) { ... }
            С удивлением обнаружил, что в C# нет метаклассов :blink:
              Цитата DesweR @
              С удивлением обнаружил, что в C# нет метаклассов :blink:
              Расстроился наверное. :D
                Цитата Повстанець @
                Расстроился наверное.

                За них да, писать им фабрики, заводы, пароходы...

                Добавлено
                Хотя у них это рефлексией обходится, только вот контроль типов будет в рантайме.
                  Цитата MyNameIsIgor @
                  Правильный здравый смысл велит сначала ознакомиться с инструментом, а потом его использовать.

                  Конечно. Но для пользования С++ "ознакомление" ничего не даст (как, например, ознакомление со Scheme в SICP). Надо зазубрить кучу всего, что "надо знать", потом наступить на множество граблей и только потом уже работать, продолжая наступать на грабли, но уже меньше, ибо опыт.
                    Цитата MyNameIsIgor @
                    Разверните мысль, пока что я не вижу никакого участия системы типов. Я вижу только различия в передачи ссылки и значения.

                    имеем:
                    ExpandedWrap disabled
                      void func (Base x) {
                        x.method()
                      }
                      Derived x
                      func(x)


                    получаем:
                    ExpandedWrap disabled
                      func = fun {
                        params = {
                          x = { type = Base; data = NIL }
                        }
                        type = void
                        body = ...
                      }
                      d = var {
                        type = Derived
                        data = ...
                      }


                    передача по значению 1:
                    ExpandedWrap disabled
                      apply func (b):
                        when {
                          b.type == f.params.x.type:
                            f.params.x.data = copy b.data as b.type;
                          b.type is f.params.x.type:
                            f.params.x.data = copy b.data as f.params.x.type;
                          else
                            error TypeCheckFailed
                        }
                        do func.body
                      }


                    передача по значению 2:
                    ExpandedWrap disabled
                      apply func (b):
                        when {
                          b.type is f.params.x.type:
                            f.params.x.data = copy b.data
                          else
                            error TypeCheckFailed
                        }
                        let f.params.x.type = b.type
                        in do func.body
                      }


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

                      Лол? Смеяться надо? Я где-то говорил, что отличия синтаксические? Наоборот, я сказал, что одна и та же запись в плюсах и яве означает разные вещи.
                      korvin, простите, я не имею желания разбирать ваше узелковое письмо, для которого даже подсветки нет. Вы поясните при чём тут система типов или так и будете "иметь" и "получать"?
                      Цитата IL_Agent @
                      Конечно. Но для пользования С++ "ознакомление" ничего не даст (как, например, ознакомление со Scheme в SICP). Надо зазубрить кучу всего, что "надо знать", потом наступить на множество граблей и только потом уже работать, продолжая наступать на грабли, но уже меньше, ибо опыт.

                      Да, в плюсах много чего надо знать. Только как из этого следует, что в кривом коде виноват язык, а не программист - не понимаю.
                        Цитата Flex Ferrum @
                        Тип перестаёт быть конкретным?

                        Нет конечно. Причём тут это и твоя синтаксически неверная конструкция ?
                          Вот если бы было так, недоразумений было бы меньше...
                          Цитата
                          void Func(Base& b)
                          {
                          b.Method();
                          }

                          int main()
                          {
                          Derive d;
                          Func(&d);
                          }
                            Цитата IL_Agent @
                            Причём тут это и твоя синтаксически неверная конструкция ?

                            Ну, на компиляемость не проверял. Пытался выразить идею передачи class'а по ссылке. С синтаксисом мог налажать, давно на шарпе не писал.


                            Цитата IL_Agent @
                            Нет конечно.

                            Вот и в случае C++ не перестаёт.

                            Добавлено
                            Цитата DesweR @
                            Вот если бы было так, недоразумений было бы меньше...

                            От вот я вас таки умоляю. :) Тем более, что префиксный & имеет в C++ конкретную семантику. Да и в паскале/делфи не предусмотрено никаких специальных конструкций для передачи аргументов, принимаемых функцией как var.
                            Сообщение отредактировано: Flex Ferrum -
                              Цитата MyNameIsIgor @
                              Да, в плюсах много чего надо знать. Только как из этого следует, что в кривом коде виноват язык, а не программист - не понимаю.

                              Никак не следует. Я это и не утверждаю. Инструменты бывают разные, как хорошие, годные, так и кривые, убогие. А за работу отвечает работник, это да...
                                Цитата IL_Agent @
                                Никак не следует. Я это и не утверждаю. Инструменты бывают разные, как хорошие, годные, так и кривые, убогие. А за работу отвечает работник, это да...

                                Так и отвечайте. Написали "передать по значению родителя" - так вам и было сделано. Разрешили копирование полиморфного класса - он и скопировался.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 179 180 [181] 182 183 ...  494 495


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