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

    Гммм... Когда я размышлял над этой проблемой, то пришёл к выводу, что самая сложная часть - определение иерархии наследования run-time. Как я понимаю, мы не можем это сделать в момент регистрации мультиметода. Возможность у нас появляется только в момент вызова с реальными экземплярами классов. Соответственно, если организовать кэш в виде хэш-таблицы, где ключом будет кортеж хэшей, полученных от type_info, то не константным по сложности будет только первый вызов, а потом мы найдём нужную функцию в кэше. Я не слишком сумбурно объясняю свои мысли? :)
    Цитата Flex Ferrum @
    Кроме того, потребуется прилинкованный RTTI.

    Не вижу в этом проблемы.
    Цитата DesweR @
    О Господи, от чужих шаловливых ручек.

    Как же они доберутся до скрываемых методов, если знают только об интерфейсе? Богомерзкой рефлексией?
      Цитата DesweR @
      О Господи, от чужих шаловливых ручек.

      и это говорит программист на языке, в котором есть интерфейсы...

      если ты говоришь, что класс A реализует интерфейс I, то он и должен реализовать этот интерфейс.

      ну сделаешь ты
      ExpandedWrap disabled
        interface I {
            void foo();
            void bar();
        }
         
        class A implements I {
            public void foo() {
                System.out.println("foo");
            }
            private void bar() {
                System.out.println("bar");
            }
        }
         
        public class App {
            private static void main(I obj) {
                obj.foo();
                obj.bar(); // что тут должно произойти по-твоему?
            }
            public static void main(String[] args) {
                main(new A());
            }
        }


      Добавлено
      Цитата DesweR @
      Мы можем заюзать недозволенный функционал.

      в каком месте он не дозволенный, если мы заявили, что класс A реализует интерфейс I?
      а по-твоему как раз получается наоборот, интерфейс позволяет получить доступ к приватным методам, хотя они приватные и не должны быть доступны и получается, что через интерфейс мы можем заюзать недозволенный функционал. в чем смысл?
        Цитата MyNameIsIgor @
        Гммм... Когда я размышлял над этой проблемой, то пришёл к выводу, что самая сложная часть - определение иерархии наследования run-time. Как я понимаю, мы не можем это сделать в момент регистрации мультиметода. Возможность у нас появляется только в момент вызова с реальными экземплярами классов. Соответственно, если организовать кэш в виде хэш-таблицы, где ключом будет кортеж хэшей, полученных от type_info, то не константным по сложности будет только первый вызов, а потом мы найдём нужную функцию в кэше. Я не слишком сумбурно объясняю свои мысли? :)

        Иерархия наследования - фигня. :) Главное - иметь возможность определить финальный тип (в рантайме). Общая идея проста (предложена Qraizer'ом). Делается n-мерный массив (n - количество аргументов в методе), каждая ячейка которого сопоставляется с уникальным кортежем типов. Дальше в ячейку заносится указатель на функцию, задача которой - преобразовать переданные параметры в соответствующие им типы и (уже типизированно) позвать диспетчер. Диспетчер, вызванный с полным набором финальных типов, делегирует выбор перегрузки компилятору (как это сделано в текущей реализации). Собственно, проблема сводится к корректному преобразованию из typeid в индекс, а также заполнению многомерной таблицы.
        Сообщение отредактировано: Flex Ferrum -
          Цитата korvin @
          ну сделаешь ты

          А если ты здесь дел натворишь?
          ExpandedWrap disabled
              IGuest = interface
                procedure ReadDocument;
              end;
             
              IUser = interface(IGuest)
                procedure WriteDocument;
              end;
             
              IAdmin = interface(IUser)
                procedure CreateDocument;
                procedure DeleteDocument;
              end;
             
              TMailService = class(TInterfacedObject, IGuest, IUser, IAdmin)
              private
                procedure ReadDocument;
                procedure WriteDocument;
                procedure CreateDocument;
                procedure DeleteDocument;
              end;

          Это правила хорошего тона программирования.
            Цитата DesweR @
            А если ты здесь дел натворишь?

            каких еще дел? я запросто могу все дела наворотить через интерфейс. какая разница-то?

            Цитата DesweR @
            Это правила хорошего тона программирования.

            лол, откуда эти правила взялись? правилом хорошего тона является утверждение, что класс реализует какой-то интерфейс, но по факту этот интерфейс не реализет?
            Сообщение отредактировано: korvin -
              Цитата Flex Ferrum @
              Иерархия наследования - фигня.

              Хз-хз...
              Цитата Flex Ferrum @
              Собственно, проблема сводится к корректному преобразованию из typeid в индекс, а также заполнению многомерной таблицы.

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

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

                  Хи хи хи :lool:, А через интерфейсы мы значит не можем этот функционал заюзать?
                    Цитата Romkin @
                    то есть клиент, использующий интерфейс ничего не знает о его реализации

                    Правильно
                    Цитата Romkin @
                    и наоборот

                    Наоборот - это как? Работающий с реализацией не знает, что она реализует? Отдаёт бредом...
                      Флекс, а как у тебя выбирается метод при множественном наследовании? т.е. например имеем классы (синтаксис условный)
                      ExpandedWrap disabled
                        class A1;
                        class A2;
                        class B : A1, A2;

                      и методы
                      ExpandedWrap disabled
                        void method(A1 x) {
                            // do something
                        }
                        void method(A2 x) {
                            // do something else
                        }

                      какой метод вызовется в случае
                      ExpandedWrap disabled
                        B b;
                        method(b);

                      ?
                        Цитата korvin @
                        каких еще дел? я запросто могу все дела наворотить через интерфейс. какая разница-то?

                        Имея только интерфейс IGuest, ты не сможешь сделать то, что доступно только IAdmin.
                        Сообщение отредактировано: DesweR -
                          Цитата DesweR @
                          Так понятней?

                          Так это было там написано, у тебя же, в твоем коде, TBC1 реализует только IB и IC, но как ты сам сказал, не реализует IA.

                          Цитата DesweR @
                          Нет, я действительно имел ввиду неизвестный на момент компиляции.
                          Либо пользователем из gui, либо каким-нибудь алгоритмом, по заданным условиям, определяются доступные реализации и регистрируются в фабрике.

                          Ггг... Во первых, что ты собрался делать с интерфейсом, не известным на этапе компиляции? Во вторых, как с ним работать, и какие методы у него вызывать? в третьих, как пользователь из gui будет его гдето регистрировать и определять доступные реализации? Оно вообще, пользователю нужно? Что за бред вообще ты несешь?
                            korvin, не знаю как у Flex'а, но по умолчанию это должно быть исключение. Поскольку плюсы не позволяют определить порядок наследования, то единственный способ настройки пользователем - это просмотр в порядке регистрации методов (или в обратном).
                              Цитата DesweR @
                              Имея только интерфейс IGuest, ты не сможешь сделать то, что доступно только IAdmin.

                              А что изменится, если методы в классе сделать паблик? Неужто, в этом случае "Имея только интерфейс IGuest ты сможешь сделать то, что доступно только IAdmin?
                                Цитата scorpion @
                                Так это было там написано, у тебя же

                                Там тоже самое написано (это я писал, если что).

                                Цитата scorpion @
                                TBC1 реализует только IB и IC, но как ты сам сказал, не реализует IA.

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


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