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

    Хм. Что ты называешь простой композицией? Явное делегирование?
    Для композиции объектов нужно знать размер каждого объекта. Здесь - не надо, поэтому я и веду разговор про объект в dll, которая может поменяться.
      Цитата korvin @
      Цитата D_KEY @
      "Какие-то объекты" - это как?

      это объекты, описания классов и интерфейсов которых тебе не доступны на этапе компиляции

      Зачем они тогда мне нужны?

      Цитата
      Цитата D_KEY @
      А как еще ты собрался с ними работать? Откуда брать о них информацию? В любом случае должно быть нечто, что будет уметь понимать тип объекта. Как иначе-то?

      у них и спрашивать

      Как у бинарного потока что-то спросить?

      Добавлено
      Цитата Romkin @
      Цитата D_KEY @
      Т.е. говорим, что реализовывать интерфейс IFoo будет не сам объект нашего класса, а Foo.
      Нет? А что тогда это значит?

      Да, делегируется. Только не свойству, а другому объекту, обычно так говорят :)
      Свойство - всего лишь способ записи.

      А ну то есть я верно понял, только в терминах напутал?
      В общем я не вижу причин, по которым вместо интерфейсов в твоем примере не могли оказаться абстрактные классы.
        Цитата D_KEY @
        В общем я не вижу причин, по которым вместо интерфейсов в твоем примере не могли оказаться абстрактные классы.

        Поясняю: есть абстрактный класс и есть его реализация в dll, которая динамически подгружается. В ней есть одна функция - получить конкретную реализацию. Как компоновать будешь?
          Цитата Romkin @
          D_KEY, ты похоже так и не понял. Вот дается тебе dll, в котрой метод получения IFoo и IBar, в твоей терминологии - абстрактных классов. Твоя задача - в своем приложении создать объект, реализующий одновременно IFoo и IBar, подгружая dll динамически (она может меняться). То есть, динамическое наследование от двух предков. На Delphi эта задача решается элементарно, просто вместо явного создания классов ставится получение интерфейсов.
          Если класс-наследник IFoo, или IBar, то dll может вернуть указатель на любой из них. Либо же просто void-указатель с приведением. Правда стрёмно всё это. dll и прога должны быть скомплены одним компилятором и одними ключами.
          Цитата korvin @
          у них и спрашивать
          Вот тебе поток:
          0x00 0x00 0x00 0x0A 0x00 0x00 0x00 0x0A 0x00 0x00 0x00 0x0A 0x00 0x00 0x00 0x0A

          Спрашивай)))
            Цитата Romkin @
            Цитата D_KEY @
            В общем я не вижу причин, по которым вместо интерфейсов в твоем примере не могли оказаться абстрактные классы.

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

            Честно говоря, не понимаю, к чему ты клонишь.
              Цитата Повстанець @
              Вот тебе поток:
              0x00 0x00 0x00 0x0A 0x00 0x00 0x00 0x0A 0x00 0x00 0x00 0x0A 0x00 0x00 0x00 0x0A

              Спрашивай)))
              да без проблем! Метод getAccessViolation я у этого объекта сразу нашёл.
                Цитата Adil @
                да без проблем! Метод getAccessViolation я у этого объекта сразу нашёл.

                А метод DoBSOD там не выглядывает из последних нескольких байт? :D
                  Цитата Повстанець @
                  Вот тебе поток:
                  0x00 0x00 0x00 0x0A 0x00 0x00 0x00 0x0A 0x00 0x00 0x00 0x0A 0x00 0x00 0x00 0x0A

                  Это морзянка :rtfm:
                    Точно. :D Радисты с серии Ж начинают передачу, чтоь на том конце успели проснуться, подстроить приём и привыкнуть к скорости.
                      Тут подумалось...
                      Если в языке запрещают множественное наследование, но при этом есть интерфейсы и возможность делегирования реализации интерфейса своему полю/свойству/etc., то зачем в таком случае оставлять одиночное наследование от конкретных классов?
                      Если такое наследование запретить, то о проблеме ограничения по количеству базовых классов и речи бы не шло - наследовались бы только интерфейсы, а реализация бы работала всегда через агрегирование(которое всегда гибче наследования реализации).
                      Чуть напоминает подход Haskell, но только для ООП.
                      Сообщение отредактировано: D_KEY -
                        Цитата D_KEY @
                        Если в языке запрещают множественное наследование, но при этом есть интерфейсы и возможность делегирования реализации интерфейса своему полю/свойству/etc., то зачем в таком случае оставлять одиночное наследование от конкретных классов?

                        Потому что гораздо больше возможностей. Каждому - свое. При наследовании наследуется не только реализация, но и метакласс. Копание с классами-записями оставим старым языкам.
                        Да, кстати. В Питоне, который исповедует принцип "наименьшего удивления":
                        ExpandedWrap disabled
                          class foo:
                              x=0
                           
                          a = foo()
                          a.x = 2
                          b=a
                          b.x=3
                          print(a.x)

                        дает 3. Я действительно не удивлен ;)

                        Добавлено
                        Вдогонку:
                        ExpandedWrap disabled
                          int f (int x, int y) {
                            return x + y;
                          }
                           
                          int z () {
                            int i = 0;
                            return f (i, i++);
                          }

                        Что вернет функция z ?
                          Цитата Romkin @
                          Потому что гораздо больше возможностей.

                          Например?

                          Цитата
                          При наследовании наследуется не только реализация, но и метакласс.

                          Может и правда примерчик?

                          Цитата
                          Копание с классами-записями оставим старым языкам.

                          :D

                          Цитата
                          Да, кстати. В Питоне, который исповедует принцип "наименьшего удивления":
                          ExpandedWrap disabled
                            class foo:
                                x=0
                             
                            a = foo()
                            a.x = 2
                            b=a
                            b.x=3
                            print(a.x)

                          дает 3. Я действительно не удивлен ;)

                          Я тоже. А чему удивляться-то?

                          Добавлено
                          Цитата Romkin @
                          Вдогонку

                          UB
                          И зачем ты это тут приводишь? Так, кстати, никто не пишет ;)
                            Цитата D_KEY @
                            Я тоже. А чему удивляться-то?

                            Поменял поле у b, а оно у a тоже поменялось. Странно это, однако.

                            Цитата D_KEY @
                            Так, кстати, никто не пишет

                            Вот не надо. Пишут :) На Delphi ты просто так не сделаешь. На Питоне, кстати, тоже.
                            Цитата D_KEY @
                            При наследовании наследуется не только реализация, но и метакласс.

                            Может и правда примерчик?

                            Примеров было уже полно. Два уровня: класс и объект, мирно друг с другом взаимодействующие. Вообще говоря, в Delphi это очень привычно.

                            Ну вот совсем недавно была задача, написать обертку для ключей защиты.
                            Имеется два модуля для доступа, для разных версий, разных драйверов. Объектный код, два модуля с одинаковыми сигнатурами функций. Требуется обертка, позволяющая одновременно работать с этими двумя API, плюс виртуальный ключ.
                            Первое, что пришло в голову:
                            ExpandedWrap disabled
                              TDongle = class
                                class function Login(...); virtual; abstract;
                                class function Logout(...); virtual; abstract;
                                constructor Create(...); //Вызывает Login...
                              ...

                            Три потомка, каждый перекрывает функции класса для доступа по-своему. Объект же определяется предком.
                              Цитата Romkin @
                              Цитата D_KEY @
                              Я тоже. А чему удивляться-то?

                              Поменял поле у b, а оно у a тоже поменялось. Странно это, однако.

                              Чего странного? Ссылочная семантика. Хочешь копии - запроси явно. Для тебя может быть странно из-за того, что у вас в Delphi может быть и так и сяк, в зависимости от типа. В питоне все единообразно.

                              Цитата
                              Цитата D_KEY @
                              Так, кстати, никто не пишет

                              Вот не надо. Пишут :)

                              Ну... Мало ли кто чего пишет, за всех отвечать не могу :-?

                              Цитата
                              На Delphi ты просто так не сделаешь.
                              Строго определен порядок вычисления аргументов функции?
                              Странно. Впрочем вам можно.

                              Цитата
                              Примеров было уже полно. Два уровня: класс и объект, мирно друг с другом взаимодействующие. Вообще говоря, в Delphi это очень привычно.

                              Да не пример метаклассов, а пример в плане наследования. При отмене наследования реализации метакласс класса можно указывать отдельно.

                              Цитата
                              Ну вот совсем недавно была задача, написать обертку для ключей защиты.
                              Имеется два модуля для доступа, для разных версий, разных драйверов. Объектный код, два модуля с одинаковыми сигнатурами функций. Требуется обертка, позволяющая одновременно работать с этими двумя API, плюс виртуальный ключ.
                              Первое, что пришло в голову:
                              ExpandedWrap disabled
                                TDongle = class
                                  class function Login(...); virtual; abstract;
                                  class function Logout(...); virtual; abstract;
                                  constructor Create(...); //Вызывает Login...
                                ...

                              Три потомка, каждый перекрывает функции класса для доступа по-своему. Объект же определяется предком.

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

                                ну да, ну да...
                                ExpandedWrap disabled
                                  a=2
                                  b=a
                                  b=3
                                  print(a)


                                Цитата D_KEY @
                                При отмене наследования реализации метакласс класса можно указывать отдельно.

                                Бррр :) Это уже я не понял.
                                Цитата D_KEY @
                                Строго определен порядок вычисления аргументов функции?
                                Странно. Впрочем вам можно.

                                Спасибо что разрешил.
                                Цитата
                                The register and pascal conventions pass parameters from left to right; that is, the left most parameter is evaluated and passed first and the rightmost parameter is evaluated and passed last. The cdecl, stdcall, and safecall conventions pass parameters from right to left.

                                Странно когда это не определено.
                                Цитата D_KEY @
                                Не понял

                                Хм... объявление "class function... virtual; abstract;" понятно?
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 218 219 [220] 221 222 ...  494 495


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.3241 ]   [ 14 queries used ]   [ Generated: 1.08.26, 15:43 GMT ]