На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (495) « Первая ... 313 314 [315] 316 317 ...  494 495  ( Перейти к последнему сообщению )  
> Delphi vs C++ vs C# , ну и Java немножко, где-то ближе к старшему байту номеров страниц
    Можно вот так сделать утиную типизацию интерфейса, но только все методы делегируем ручками (можно автоматом посредством RTTI, но тогда лишаемся проверки в компил-тайме).
    ExpandedWrap disabled
      type
        TSomeClass1 = class
        public
          procedure Foo;
          procedure Bar(const AValue: Integer);
        end;
       
        TSomeClass2 = class
        public
          procedure Foo;
          procedure Bar(const AValue: string);
        end;
       
       
        TSomeInterface = record
        public
          class var Foo: procedure of object;
          class var Bar: procedure(const AValue: Integer) of object;
        end;
       
       
      procedure TSomeClass1.Foo;
      begin
        Writeln('TSomeClass1.Foo');
      end;
       
      procedure TSomeClass1.Bar(const AValue: Integer);
      begin
        Writeln(Format('TSomeClass1.Bar(%d)', [AValue]));
      end;
       
       
      procedure TSomeClass2.Bar(const AValue: string);
      begin
      end;
       
      procedure TSomeClass2.Foo;
      begin
      end;
       
       
      var
        SomeClass1: TSomeClass1;
        SomeClass2: TSomeClass2;
        SomeInterface: TSomeInterface;
      begin
        SomeClass1 := TSomeClass1.Create;
        SomeClass2 := TSomeClass2.Create;
       
        with SomeInterface do
        begin
          Foo := SomeClass1.Foo;
          Bar := SomeClass1.Bar;
        end;
       
      //  а вот это не сработает
      //  with SomeInterface do
      //  begin
      //    Foo := SomeClass2.Foo;
      //    Bar := SomeClass2.Bar; //Incompatible types: 'Integer' and 'string'
      //  end;
       
        SomeInterface.Foo;
        SomeInterface.Bar(42);
       
        Readln;
      end.

    ExpandedWrap disabled
      TSomeClass1.Foo
      TSomeClass1.Bar(42)
    Сообщение отредактировано: DesweR -
      Цитата scorpion @
      Напомните плз, про мультиметоды, только в вики не посылайте плз, а то там непонятно както :huh:

      мультиметоды в отличие от обычных методов диспетчеризуются по всем своим аргументам, т.е. определении обычных методов
      ExpandedWrap disabled
        void MyClass::myMethod (int x, int y) {
            // code 1
        }
         
        void MyMegaClass::myMethod (int x, int y) {
            // code 2
        }

      можно условно представить так:
      ExpandedWrap disabled
        void myMethod (MyClass this, int x, int y) {
            // code 1
        }
         
        void myMethod (MyMegaClass this, int x, int y) {
            // code 2
        }

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

      в мультиметодах же код выбирается по типам всех аргументов метода. например:
      ExpandedWrap disabled
        void myMethod (MyClass x, MyClass y) {
            // code 1
        }
         
        void myMethod (MyMegaClass x, MyClass y) {
            // code 2
        }
         
        void myMethod (MyClass x, MyMegaClass y) {
            // code 3
        }
         
        void myMethod (MyMegaClass x, MyMegaClass y) {
            // code 4
        }


      это основное. в CLOS есть некоторые дополнительные фишки, типа определение порядка просмотра типов аргументов метода
      Сообщение отредактировано: korvin -
        Цитата korvin @
        в мультиметодах же код выбирается по типам всех аргументов метода. например:

        Можешь ещё пример использования? разобрался.
        Сообщение отредактировано: DesweR -
          Цитата DesweR @
          Я имею ввиду случаи, когда реализации интерфейсов скрываются либо в целях ограничения доступа извне, либо из-за удобства декомпозиции самого функционала.

          Цитата DesweR @
          Но. И в любых других случаях, также нет смысла делать реализацию публичной, без какой-либо необходимости на то, т.к. клиенты всё равно работают через интерфейсы, а не через реализующие их объекты.

          Если мы реализуем какой-то интерфейс, то я не вижу смысла делать методы приватными - клиент всё равно имеет к ним доступ через интерфейс.
            Цитата MyNameIsIgor @
            Если мы реализуем какой-то интерфейс, то я не вижу смысла делать методы приватными - клиент всё равно имеет к ним доступ через интерфейс.

            Встречный вопрос, а зачем твоему клиенту интерфейс, если можно сразу пользоваться экземпляром класса? :D
            Это не отменяет главного:
            Цитата MyNameIsIgor @
            когда реализации интерфейсов скрываются либо в целях ограничения доступа извне
              Цитата DesweR @
              Встречный вопрос, а зачем твоему клиенту интерфейс, если можно сразу пользоваться экземпляром класса?

              Это смотря какой клиент. Кто-то знает только о интерфейсе, кто-то может знать и о реализации.
              Цитата DesweR @
              Это не отменяет главного:
              когда реализации интерфейсов скрываются либо в целях ограничения доступа извне

              Ещё раз: вы ничего не скрыли, через интерфейс всё равно всё торчит наружу.
                Цитата Qraizer @
                Вообще, хотелось в ним поболтать на кое-какие темы и родить нормальную библиотечную версию. Он даже не был против, но рутина затянула. Программа максимум - параметризировать количество параметров мультиметода.

                Ну, давай поболтаем. :) У меня как раз библиотекчка для таких дел подбирается. Там сейчас проперти, ленивые списки, надо бы и мультиметоды добавить.
                Сообщение отредактировано: Flex Ferrum -
                  Цитата MyNameIsIgor @
                  Ещё раз: вы ничего не скрыли, через интерфейс всё равно всё торчит наружу.

                  Что там торчит - зависит от того, какой у меня интерфейс на руках (IGuest или IAdmin или ...).
                    Цитата DesweR @
                    Что там торчит - зависит от того, какой у меня интерфейс на руках (IGuest или IAdmin или ...).

                    Тогда не понятно, что и от кого вы собрались скрывать, если говорите только о пользователях интерфейсов...
                      Цитата Qraizer @
                      Меньше, чем по вызову на параметр, боюсь, не получится даже в поддержкой на уровне языка. По-любому по VMT придётся восстанавливать тип каждого параметра отдельно, и где-то хранить n-размерную матрицу указателей на перекрытые методы, а это скорее всего ещё один вызов. Так что на этом примере получилось бы три вызова.

                      Ты знаешь, сейчас взглянул в новый стандарт, в частности, вот на эту декларацию:
                      ExpandedWrap disabled
                        namespace std {
                        class type_info {
                        public:
                        virtual ~type_info() noexcept;
                        bool operator==(const type_info& rhs) const noexcept;
                        bool operator!=(const type_info& rhs) const noexcept;
                        bool before(const type_info& rhs) const noexcept;
                        size_t hash_code() const noexcept;
                        const char* name() const;
                        type_info(const type_info& rhs) = delete; // cannot be copied
                        type_info& operator=(const type_info& rhs) = delete; // cannot be copied
                        };
                        }

                      И понял, что вполне можно сделать неинтрузивный мультиметод с произвольным числом параметров и константным временем поиска. Правда, получится хит по памяти (многомерная виртуальная таблица), но...
                        Цитата Flex Ferrum @
                        И понял, что вполне можно сделать неинтрузивный мультиметод с произвольным числом параметров и константным временем поиска. Правда, получится хит по памяти (многомерная виртуальная таблица), но...

                        За подобную штуку, особенно в виде либы, был бы мегаблагодарен!
                          Цитата MyNameIsIgor @
                          За подобную штуку, особенно в виде либы, был бы мегаблагодарен!

                          Ну, на самом деле, там не совсем константное время поиска получится. Потому что потребутеся преобразовывать хэш типа аргумента в индекс. За константное время это сделать нельзя. Кроме того, потребуется прилинкованный RTTI. И это если считать, что определение типа по указателю на полиморфный класс занимает время, близкое к константе.
                            Цитата MyNameIsIgor @
                            Тогда не понятно, что и от кого вы собрались скрывать, если говорите только о пользователях интерфейсов...

                            О Господи, от чужих шаловливых ручек.
                              Цитата MyNameIsIgor @
                              Если мы реализуем какой-то интерфейс, то я не вижу смысла делать методы приватными - клиент всё равно имеет к ним доступ через интерфейс.

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

                                Это где написано? Интерфейс требует только реализации, а уж где и какой ему монописуально.

                                Цитата korvin @
                                как будто мы можем увидеть исходный код паблик-метода и какие приватные поля он использует в объекте

                                Мы можем заюзать недозволенный функционал.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 313 314 [315] 316 317 ...  494 495


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