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

    Я могу подгрузить и выгрузить плагин с классом, по которому мне нужна диспетчеризация.
    Цитата D_KEY @
    Ничего страшного не вижу, но и смысла такого действия не понимаю.

    Цитата Romkin @
    Не к предку, а так принцип похож.

    Господа, я же специально оговорился
    Цитата MyNameIsIgor @
    переводя на твой пример
      Цитата korvin @
      но весь смысл сабтайпинга на смарку =)

      Почему? Ведь нужный метод будет вызыван. Просто класс по какой-то причине решил, что при работе именно с его контрактом этот метод использовать нельзя... Хотя я пока не знаю, зачем это может понадобиться.

      Цитата
      Цитата D_KEY @
      Уверен? Мне казалось, что я так делал. Пойду читать :)
      Если ты прав, то спасибо за поправку :)

      уверен. проверено в IDEA =)

      Может и в C# тогда нельзя?
      Вообще странное поведение.

      Добавлено
      Цитата Romkin @
      у него идет подсчет ссылок

      Я вот одного не понимаю, почему в Delphi интерфейсы смешали с подсчетом ссылок?
        Цитата D_KEY @
        Я вот одного не понимаю, почему в Delphi интерфейсы смешали с подсчетом ссылок?

        Да там и COM смешали с языком... . И паттерны смешали с языком... . И много что смешали.
          Цитата D_KEY @
          Почему? Ведь нужный метод будет вызыван. Просто класс по какой-то причине решил, что при работе именно с его контрактом этот метод использовать нельзя... Хотя я пока не знаю, зачем это может понадобиться.

          да фигня какая-то имхо.

          Цитата D_KEY @
          Может и в C# тогда нельзя?
          Вообще странное поведение.

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

            Ну, сам этот класс должен быть известен на этапе построения диспатчера. Так? Значит и thunk-и ты можешь для него прописать заранее. А они, в свою очередь, могут работать по-разному в зависимости от наличия загруженного плагина. Таким образом, диспетчер остаётся полностью статически-типизируемым.
              Цитата korvin @
              приватные мемберы класса доступны только ему, защищенные -- ему и наследникам, публичные -- всем

              Именно так. Доступа к методу у тебя нет, но перекрытие не является формой доступа :)
              ExpandedWrap disabled
                class A
                {
                public:
                    void f()
                    {
                        f1();
                        f2();
                        f3();
                    }
                 
                protected:
                    virtual void f1();
                 
                private:
                    virtual void f2()
                    virtual void f3();
                 
                };
                 
                class B : public A
                {
                public:
                    //...
                 
                protected:
                    virtual void f1()
                    {
                        // имеем доступ к A::f1
                    }
                 
                private:
                    virtual void f2()
                    {
                        // НЕ имеем доступ к A::f2
                    }
                 
                    virtual void f3()
                    {
                        // НЕ имеем доступ к A::f3
                    }
                };


              Как мне обеспечить это в Java/Delphi? Зачем предоставлять дополнительный доступ, если требуется лишь возможность перекрытия?
              Сообщение отредактировано: D_KEY -
                Цитата Flex Ferrum @
                Ну, сам этот класс должен быть известен на этапе построения диспатчера. Так?

                При построении плагина - да. Приложения - нет. В приложении я только знаю, что мне из плагина отдадут наследника какого-то базового класса.
                  Цитата D_KEY @
                  Цитата korvin @
                  приватные мемберы класса доступны только ему, защищенные -- ему и наследникам, публичные -- всем

                  Именно так. Доступа к методу у тебя нет, но перекрытие не является формой доступа :)
                  ExpandedWrap disabled
                    class A
                    {
                    public:
                        void f()
                        {
                            f1();
                            f2();
                            f3();
                        }
                     
                    protected:
                        virtual void f1();
                     
                    private:
                        virtual void f2()
                        virtual void f3();
                     
                    };
                     
                    class B : public A
                    {
                    public:
                        //...
                     
                    protected:
                        virtual void f1()
                        {
                            // имеем доступ к A::f1
                        }
                     
                    private:
                        virtual void f2()
                        {
                            // НЕ имеем доступ к A::f2
                        }
                     
                        virtual void f3()
                        {
                            // НЕ имеем доступ к A::f3
                        }
                    };


                  Как мне обеспечить это в Java/Delphi? Зачем предоставлять дополнительный доступ, если требуется лишь возможность перекрытия?

                  в смысле? т.е. при вызове B::f() будет вызван B::f2(), а не A::f2()?
                    Цитата korvin @
                    в смысле? т.е. при вызове B::f() будет вызван B::f2(), а не A::f2()?

                    Да.

                    Добавлено
                    В тему свойств, наткнулся на цитату Джефри Рихтера
                    Цитата
                    Лично мне свойства не нравятся, и я был бы рад, если бы их поддержку убрали из Microsoft .NET Framework и сопутствующих языков программирования. Причина в том, что свойства выглядят как поля, на самом деле являясь методами
                      Цитата D_KEY @
                      ExpandedWrap disabled
                        ...
                         
                        class B : public A
                        {
                            ...
                         
                        protected:
                            virtual void f1()
                            {
                                // имеем доступ к A::f1
                            }
                        ...
                        };

                      нет, в Java мы не имеем доступ к A::f1.
                        Цитата scorpion @
                        И когда как? Пример можно привести? Зачем тогда нужен интерфейс с дополнительным функционалом?

                        Для использования интерфейсов в Delphi есть несколько дизайн-паттернов, каждый выбирается в конкретном случае.
                        1. Есть подсчет ссылок/нет подсчета
                        2. Интерфейс агрегирован, содержится или реализован напрямую
                        3. Есть публичные методы или нет
                        и так далее. Все достаточно разнообразно.
                        Если объект основной, то как правило у него есть свой функционал и нет подсчета ссылок, интерфейсы - дополнительные функции, например для системы сохранения/загрузки или управления транзакцией или получения дополнительной информации.
                        Если работа через интерфейсы, то опять же как правило делают подсчет ссылок и закрывают все методы кроме служебных, это еще и страховка: в Delphi нет явных способов понять что объект уже уничтожен. В этом случае подразумевается что функционал не знает с каким именно объектом он работает.
                        Ну и естественно возможны другие варианты.

                        Цитата D_KEY @
                        Я вот одного не понимаю, почему в Delphi интерфейсы смешали с подсчетом ссылок?

                        Почему нет? Впрочем, ответ простой, изначально они появились из-за поддержки COM, а потом так и осталось.
                        Цитата D_KEY @
                        Как мне обеспечить это в Java/Delphi?

                        Эээ. Через свойства подобное можно сделать.

                        Или нет. Вроде нельзя, по крайней мере в голову ничего путного не приходит.
                        Сообщение отредактировано: Romkin -
                          Цитата korvin @
                          нет, в Java мы не имеем доступ к A::f1.

                          Ы? А как жеж?
                          ExpandedWrap disabled
                            super.f1()
                            Цитата D_KEY @
                            Может и в C# тогда нельзя?

                            Вроде там идет ошибка компиляции при попытке создания закрытого виртуального/абстрактного метода. Проверить не могу.
                              Цитата D_KEY @
                              Да.

                              не нравится мне это =)

                              Цитата D_KEY @
                              В тему свойств, наткнулся на цитату Джефри Рихтера
                              Цитата
                              Лично мне свойства не нравятся, и я был бы рад, если бы их поддержку убрали из Microsoft .NET Framework и сопутствующих языков программирования. Причина в том, что свойства выглядят как поля, на самом деле являясь методами

                              молодец Рихтер, всё правильно сказал

                              Добавлено
                              Цитата MyNameIsIgor @
                              Цитата korvin @
                              нет, в Java мы не имеем доступ к A::f1.

                              Ы? А как жеж?
                              ExpandedWrap disabled
                                super.f1()

                              private-метод нельзя так вызвать
                                Цитата korvin @
                                private-метод нельзя так вызвать

                                Так он protected

                                Добавлено
                                У D_KEY'я A::f1 - защищённый, а не приватный.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 320 321 [322] 323 324 ...  494 495


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