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

    get/set -- это условно, мне лень было придумывать кучу методов. разница в невозможности изменить часть объекта независимо от объекта, т.е. взять "адрес" на внутренний объект, передать куда-то и где-то там менять.

    Что-то странное мутишь :)
    Но можно сделать, как Мяут показал - хранить "методы" такого доступа в качестве функциональных полей объекта и мапить их на нужные методы нужных объектов.

    Добавлено
    korvin, все-таки, зачем все это городить?
      мне и не нужно городить, ты мой пример на яве видел? Где там огород? =)
        Цитата korvin @
        мне и не нужно городить, ты мой пример на яве видел? Где там огород? =)

        А он у тебя там работающий, а?
        Ты можешь в двух словах объяснить, зачем это нужно? Может ты какую идиому интересную придумал, которая этого требует, а от простого трудового народа скрываешь :D
          Цитата D_KEY @
          А он у тебя там работающий, а?

          нет конечно, это пример как оно должно выглядеть(с поправкой на жабосинтаксис) и работать
            Цитата korvin @
            Цитата D_KEY @
            А он у тебя там работающий, а?

            нет конечно, это пример как оно должно выглядеть(с поправкой на жабосинтаксис) и работать

            Так вот и я о том. Ты говоришь, что городить не надо, хотя для того, чтобы сделать твой пример работающим городить все-таки нужно.
            Или зашивать в язык. Вот я и спрашиваю, зачем это нужно языку программирования?
              Поддерживаю D_KEY.
              Господа, может пора прекратить требовать реализации оторванных от реальности языковых возможностей и перейти к реализации завершенных и целостных языковых концепций?
                Цитата Мяут-Настоящий @
                Поддерживаю D_KEY.
                Господа, может пора прекратить требовать реализации оторванных от реальности языковых возможностей и перейти к реализации завершенных и целостных языковых концепций?

                это каких например?
                  Цитата Qraizer @
                  Цитата IL_Agent @
                  В C# это не так. При реализации придётся явно указать, от какого интерфейса взят метод.
                  Вот это уже интереснее. Требуется явная квалификация? А когда? Всегда или только при коллизиях?

                  Ну да, я так и написал: требуется явно указать, какому именно интерфейсу принадлежит реализуемый метод.
                  Можно указывать интерфейс при реализации любого метода, при коллизиях это необходимо.
                  Пример приводился:
                  Цитата MyNameIsIgor @
                  Например, так
                  ExpandedWrap disabled
                        using System;
                        
                        interface IA
                        {
                          void f();
                        }
                        
                        interface IB
                        {
                          void f();
                        }
                        
                        class A : IA, IB
                        {
                          void IA.f() { Console.WriteLine("IA.f"); }
                          void IB.f() { Console.WriteLine("IB.f"); }
                        }
                        
                        class Program
                        {
                          public static void Main(string[] args)
                          {
                            A a = new A();
                            (a as IA).f();
                            (a as IB).f();
                          }
                        }
                    Цитата D_KEY @
                    Вот я и спрашиваю, зачем это нужно языку программирования?

                    чтоб нельзя было это объектное свойство использовать отдельно от объекта-"контейнера".

                    Добавлено
                    Цитата Мяут-Настоящий @
                    Поддерживаю D_KEY.
                    Господа, может пора прекратить требовать реализации оторванных от реальности языковых возможностей и перейти к реализации завершенных и целостных языковых концепций?

                    кстати, как у тебя дела с изучением питона? может оттуда какую "завершенную и целостную языковую концепцию" подкинешь?
                      Цитата korvin @
                      Цитата D_KEY @
                      Вот я и спрашиваю, зачем это нужно языку программирования?

                      чтоб нельзя было это объектное свойство использовать отдельно от объекта-"контейнера".

                      Это-то понятно :D Зачем это? Ты посылаешь объекту сообщение и получаешь результат.
                      И я не зря тебе говорил про LoD...
                        Цитата D_KEY @
                        Это-то понятно :D Зачем это? Ты посылаешь объекту сообщение и получаешь результат.

                        ExpandedWrap disabled
                          class A {
                              public void foo () {}
                              public void bar () {}
                          }


                        ну смотри, по сути тут просто наследование:
                        ExpandedWrap disabled
                          class B extends A {
                              public void gee () {}
                          }

                        и все, сам A внутри B невиден, но его методы доступны. но мне-то нужно два(или больше) объекта A внутри B

                        вариант второй:
                        ExpandedWrap disabled
                          class B {
                              private A x = new A();
                              private A y = new A();
                           
                              public void x_foo () {
                                  x.foo();
                              }
                              public void x_bar () {
                                  x.bar();
                              }
                              public void y_foo () {
                                  y.foo();
                              }
                              public void y_bar () {
                                  y.bar();
                              }
                          }

                        итого получаем необходимость описывать n*m методов-оберток, где n -- количество полей объектов, m -- количество методов в классе поля-объекта

                        Цитата D_KEY @
                        И я не зря тебе говорил про LoD...

                        о, забыл по ссылке сходить, ща гляну
                          Цитата DesweR @
                          ИМХО тут как раз место агрегации.
                          Аргументируй, плз. Я к примеру не вижу логики в том, чтобы использовать именно агрегацию. Этот компонент будет реализовывать оба эти интерфейса, а не использовать их. Агрегации тут ИМХО не место.
                          Цитата DesweR @
                          Если забыл, в Delphi есть штатные средства для решения таких коллизий.
                          Не забыл. Знаю, есть. Только та фраза относилась не к моему вопросу о разрешении коллизий, а твоему (точнее korvin-а) примеру о невозможности вызова A.f, если есть IB.f, причём никакой AS тут не поможет. Как обычно ты попробовал что-то сказать лишь бы что-то сказать.
                          Цитата DesweR @
                          Это отчасти вытекает из идеологии COM'а ... а для этого класс A, должен содержать реализацию интерфейсов и child и parent.
                          И? Ты сказал то же, что и я. Почему, если А реализует и parent в частности, то его нельзя передать в функцию, принимающую интерфейс parent? Или Shaggy что-то путает?
                          Цитата DesweR @
                          ?
                          Ты действительно этого хочешь? Пошагово?
                          ExpandedWrap disabled
                            class ISome1 {/* ... */};                // интерфейс1
                            class ISome2 {/* ... */};                // интерфейс2
                            class Some1 : public ISome1 {/* ... */}; // одна из реализаций первого
                            class Some2 : public ISome2 {/* ... */}; // одна из реализаций второго
                             
                            void f(ISome1&);                         // Функция принимающая интерфейс. Одной хватит для демонстрации идеи.
                             
                            class SuperSome : public Some1, public Some2 {/* ... */};  // "компонент", собранный из готовых кирпичиков
                             
                            int main()
                            {
                              SuperSome object;
                             
                              f(object);
                            }
                          Не буду делать много экземпляров, функций, реализаций итп, идея должна быть ясна и так. Я могу переписать с агрегацией, если это больше подходит по дизайну:
                          ExpandedWrap disabled
                            class ISome1 {/* ... */};
                            class ISome2 {/* ... */};
                            class Some1 : public ISome1 {/* ... */};
                            class Some2 : public ISome2 {/* ... */};
                             
                            void f(ISome1&);
                             
                            class SuperSome
                            {
                              Some1 s1;                              // "реализация" первого
                              Some2 s2;                              // "реализация" второго
                            /* ... */
                            };
                             
                            int main()
                            {
                              SuperSome object;
                             
                              f(object);   // Опа-на, fail.
                            }
                          На Плюсах я могу решить эту проблему несколькими способами. Например, так:
                          ExpandedWrap disabled
                            class SuperSome : public ISome1, public ISome2 {/* ... */};  // "компонент", собранный из интерфейсов
                            {
                              Some1 s1;
                              Some2 s2;
                            /* ... */
                            public:
                              operator ISome1&() { return s1; }
                            };
                          Или так:
                          ExpandedWrap disabled
                            class SuperSome : public ISome1, public ISome2 {/* ... */};
                            {
                              Some1 s1;
                              Some2 s2;
                            /* ... */
                            public:
                              ISome1& getISome1() { return s1; }
                            };
                            /* ... */
                              f(object.getISome1());
                          Или даже так:
                          ExpandedWrap disabled
                            class SuperSome : public ISome1, public ISome2 {/* ... */};
                            {
                            public:
                              Some1 s1;
                              Some2 s2;
                            /* ... */
                            };
                            /* ... */
                              f(object.s1);
                          Все они неполноценны. Хотя бы потому, что ни полимофизм, ни dynamic_cast<> через границы агрегированных объектов тут работать не будут. Вернее, полиморфизм-то будет, но только у каждого в своей ветке Superобъекта. И это можно решить, только уже не так просто. Подозреваю, что решать придётся в духе VCL, с полями парентовых контролов, динамическими методами сиречь штрафами в run-time, счётчиками ссылок на чиелдов итп. А всё почему? Задокументировав "явление" собой обоих этих интерфейсов, реализация в этой документированности врёт. Она ими не "является", она их использует.
                          Вот я и спрашиваю, действительно "сложность" множественного наследования реализаций того стоила, чтобы от неё отказываться? Первый-то вариант идеален.
                          IL_Agent, кульно. А вот касательно
                          Цитата IL_Agent @
                          Пример приводился:...
                          не понял. Таки AS работает? Хто обманывает? Или чего я не учёл?
                            Цитата korvin @
                            итого получаем необходимость описывать n*m методов-оберток, где n -- количество полей объектов, m -- количество методов в классе поля-объекта

                            Ты описываешь классы, как контейнеры с кучей полей... Это как-то больше напоминает Сишные структуры, чем классы...
                              Цитата D_KEY @
                              И я не зря тебе говорил про LoD...

                              Цитата
                              Each unit should have only limited knowledge about other units: only units "closely" related to the current unit.

                              дык я это и предлагаю, вместо того, чтобы делать конкретные обертки (т.е. классу-контейнеру уже нужно знать, какие методы есть у внутреннего класса), просто разрешить доступ к интерфейсу объекта, но не позволяем внешнему коду работать с этим внутренним объектом "за спиной" у контейнера =)

                              Добавлено
                              Цитата D_KEY @
                              Ты описываешь классы, как контейнеры с кучей полей... Это как-то больше напоминает Сишные структуры, чем классы...

                              блин, я не говорю, что нужно пихать кучу таких полей в классах, но бывает удобно. считай это просто еще одним видом наследования, только не на уровне классов, а на уровне объектов
                                Цитата korvin @
                                но мне-то нужно два(или больше) объекта A внутри B
                                Та скажи ж ты им, наконец, как ты хочешь "два(или больше) объекта A" отличать друг от друга. Синтаксически. Вон, DesweR "догадался" нумеровать. Мне тоже более изящного решения в голову не приходит.
                                2 пользователей читают эту тему (2 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 145 146 [147] 148 149 ...  494 495


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