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

    Откуда такой вывод? Будь они похожи у них конечно же был бы общий предок, который мы могли использовать в качестве C.

    Добавлено
    Цитата MyNameIsIgor @
    Цитата korvin @
    Эм... каких требований не хватает? Определение C = A or B вроде вполне однозначно. Впрочем если есть какие-то конкретные вопросы -- задавай.

    Ну, например, если имеем
    ExpandedWrap disabled
      foo(a : A)

    и мы сделали
    ExpandedWrap disabled
      var x : C
      x = new B

    то как должен вести себя
    ExpandedWrap disabled
      foo(x)

    ?

    Ошибка компиляции. Либо нужно писать что-то вроде
    ExpandedWrap disabled
      if (x instanceof A) {
          foo((A) x);
      }


    Добавлено
    Цитата MyNameIsIgor @
    Кто бы спорил... Тут, imho, всё зависит от требований, в том числе желаемого синтаксиса.

    Кроме неуниверсальности у данного решения есть еще проблема: как бы это сказать, разброс определения.
    Т.е. мы раскидываем определение типа C по типам A и B. Если у нас много типов, то такие зависимости может быть сложно отследить.
    Для
    ExpandedWrap disabled
      type A
      type B
      type C
      type D
       
      type W = A or B
      type X = C or D
      type Y = B or C or D
      type Z = A or Y

    получим
    ExpandedWrap disabled
      class Z;
      class Y : Z;
      class X;
      class W;
       
      class A : W, Z;
      class B : W, Y;
      class C : X, Y;
      class D : X, Y;

    И они хуже отражают суть + у A, B, C и D могут быть и другие предки, не связанные с W, X, Y, Z.
      Цитата korvin @
      Ошибка компиляции. Либо нужно писать что-то вроде
      ExpandedWrap disabled
        if (x instanceof A) {
            foo((A) x);
        }

      Ну, если прямо C засовывать в foo, то да, ошибка компиляции. Аналогом instanceof будет boost::get - например.
        Цитата korvin @
        Ошибка компиляции.

        А если динамичеки присваивать?
        ExpandedWrap disabled
          var x : C
           
          x = new B
          foo(x)
           
          x = new A
          foo(x)

        ?

        Добавлено
        Если хочется строгой типизации (правда в одну сторону), то можно реализовать на перегрузках оператора присваивания (на С++ тут лучше получится).
        ExpandedWrap disabled
            TCommon<T1, T2 .. Tn> = record
            strict private
              F1: T1;
              F2: T2;
            public
              class operator Implicit(A1: T1): TCommon<T1, T2>;
              class operator Implicit(A1: TCommon<T1, T2>): T1;
           
              class operator Implicit(A2: T2): TCommon<T1, T2>;
              class operator Implicit(A2: TCommon<T1, T2>): T2;
           
              ...
            end;
           
          var
            C: TCommon<TA, TB>;
          begin
            C := TA.Create;
            C := TB.Create;
            C := TG.Create; //ошибка

        Ну а если не хочется, то в рантайме без проблем (ну а тут у нас).
        Сообщение отредактировано: DesweR -
          Цитата DesweR @
          Ну а если не хочется, то в рантайме без проблем (ну а тут у нас).

          А мой пример имеет какие-то проблемы в рантайме?
            Цитата MyNameIsIgor @
            А мой пример имеет какие-то проблемы в рантайме?

            Да нет наверное, хотя я его не видел :)

            Добавлено
            Там можно задать ограничение множеством?
              Цитата DesweR @
              А если динамичеки присваивать?
              ExpandedWrap disabled
                var x : C
                 
                x = new B
                foo(x)
                 
                x = new A
                foo(x)

              ?

              Нет, ты не понял, у нас сигнатура foo
              ExpandedWrap disabled
                foo (x : A)

              из
              ExpandedWrap disabled
                var x : A

              следует, что x : C, т.е. его можно спокойно передать в любое место, где требуется C.

              Но из
              ExpandedWrap disabled
                var x : C

              не следует, что x : A всегда, он может быть как A, так и B. Соответственно его нельзя свободно без проверки передать туда, где требуется A.
              Сообщение отредактировано: korvin -
                Цитата korvin @
                Нет, ты не понял, у нас сигнатура foo (x : A), из x : A следует, что x : C, но из x : C не следует, что x : A всегда, нужна проверка и каст. У нас же статическая типизация.

                Но нам x: C может приходить извне, вообще из другого модуля. И при раздельной компиляции мы можем просто не иметь возможности вывести, что же туда запихнули.
                Опять же какая-то фабрика может производить x: C, которые хз что.
                Чтобы статически выводить это всё, надо очень сильно усложнять модель компиляции.
                Сообщение отредактировано: MyNameIsIgor -
                  Цитата MyNameIsIgor @
                  надо очень сильно усложнять модель компиляции.

                  Или очень сильно упростить - валить все в одну кучу и никаких библиотек! :)
                    Цитата D_KEY @
                    Или очень сильно упростить - валить все в одну кучу и никаких библиотек!

                    Мне кажется, что это как раз усложнение :D
                      Что-то я не пойму сути дискуссии. Мы тут выдумываем новую форму полиморфизма?
                      По-любому у A и B должны быть общие черты, иначе foo(), окромя как банальным aka switch, не сможет с ними работать, тогда уж проще её перегрузить. В потивносм случае - на выбор class A: C или template <typename T> class C: T.
                      Сообщение отредактировано: Qraizer -
                        Цитата Qraizer @
                        По-любому у A и B должны быть общие черты, иначе foo(), окромя как банальным aka switch, не сможет с ними работать

                        Ну так вообще-то о том и речь. По сути, типы-суммы(то, что просит korvin) являются частным случаем алгебраических типов данных(упрощенно говоря - вариантных типов).
                        А тут без сопоставления с образцом(aka switch) особо не разгуляешься.
                        Сообщение отредактировано: D_KEY -
                          А как вы относитесь к э-э-э... способу указания возвращаемого значения функции: переменная Result как в Delphi или инструкция return, как в остальных обсуждаемых языках? Какой способ по-вашему лучше и почему?
                            А как в делфи происходит досрочный выход из функции?
                              Цитата Повстанець @
                              А как в делфи происходит досрочный выход из функции?

                              ExpandedWrap disabled
                                Exit;
                                Цитата korvin @
                                переменная Result как в Delphi
                                В VB вроде так же. Или почти также - имя функции в качестве хранилища ее результата.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 411 412 [413] 414 415 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.5480 ]   [ 14 queries used ]   [ Generated: 30.07.26, 00:10 GMT ]