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

    Я ж написал: компилятор потребует явно указать, что и куда. Вот из хелпа:
    ExpandedWrap disabled
      For example, the class declaration:
       
      type
        TMemoryManager = class(TInterfacedObject, IMalloc, IErrorInfo)
          function IMalloc.Alloc = Allocate;
          procedure IMalloc.Free = Deallocate;
          // ...
        end;
      maps IMalloc's Alloc and Free methods onto TMemoryManager's Allocate and Deallocate methods.
       
      A method resolution clause cannot alter a mapping introduced by an ancestor class.
      Цитата D_KEY @
      В С++ нет концепции интерфейсов, так что о каком выборе в С++ идет речь мне до сих пор не понятно.

      А как же абстрактные классы? Неужто они не являются концепциями интерфейсов в в частных случаях?
        Цитата scorpion @
        Цитата D_KEY @
        В С++ нет концепции интерфейсов, так что о каком выборе в С++ идет речь мне до сих пор не понятно.

        А как же абстрактные классы? Неужто они не являются концепциями интерфейсов в в частных случаях?

        Я уже говорил, что наличие абстрактных классов и множественного наследования в языке приводит к тому, что интерфейсы(в том виде, что есть в Java/C#/etc.) не востребованы. Но их этого не следует, что абстрактные классы и интерфейсы - одно и тоже.
          Цитата D_KEY @
          Я уже говорил, что наличие абстрактных классов и множественного наследования в языке приводит к тому, что интерфейсы(в том виде, что есть в Java/C#/etc.) не востребованы. Но их этого не следует, что абстрактные классы и интерфейсы - одно и тоже.

          Впрочем как и не следует, что интерфейсы должны быть в виде концептов ;)
            Цитата D_KEY @
            Я уже говорил, что наличие абстрактных классов и множественного наследования в языке приводит к тому, что интерфейсы(в том виде, что есть в Java/C#/etc.) не востребованы.

            Потому что абстрактные классы эту концепцию уже поддерживают, бессмысленно вводить в язык еще несколько ключевых слов, чтобы продублировать уже имеющуюся систему.

            Цитата D_KEY @
            Но их этого не следует, что абстрактные классы и интерфейсы - одно и тоже.

            Этого никто вроде как и не говорил. Но при этом абстрактным классам ничто не мешает быть интерфейсами. А вот интерфейс != абстрактный класс, тут уже не поспоришь. Хотя наоборот возможно.
            Сообщение отредактировано: scorpion -
              Цитата scorpion @
              Цитата D_KEY @
              Я уже говорил, что наличие абстрактных классов и множественного наследования в языке приводит к тому, что интерфейсы(в том виде, что есть в Java/C#/etc.) не востребованы.

              Потому что абстрактные классы эту концепцию уже поддерживают, бессмысленно вводить в язык еще несколько ключевых слов, чтобы продублировать уже имеющуюся систему.

              Именно.

              Цитата
              Но при этом абстрактным классам ничто не мешает быть интерфейсами.

              Мешает. Отличия были описаны выше в постах Romkin'a и Flex'а.

              Добавлено
              Цитата MyNameIsIgor @
              Цитата D_KEY @
              Я уже говорил, что наличие абстрактных классов и множественного наследования в языке приводит к тому, что интерфейсы(в том виде, что есть в Java/C#/etc.) не востребованы. Но их этого не следует, что абстрактные классы и интерфейсы - одно и тоже.

              Впрочем как и не следует, что интерфейсы должны быть в виде концептов ;)

              Чего?
                Цитата D_KEY @
                Мешает. Отличия были описаны выше в постах Romkin'a и Flex'а.

                Конкретно в каком месте?
                Вот например:
                ExpandedWrap disabled
                  struct ISomeInterface
                  {
                     virtual void SomeMethod1(/*...*/) = 0;
                     virtual void SomeMethod2(/*...*/) = 0;
                     ...
                  };

                Где конкретно предоставленный интерфейскласс противоречит концепции интерфейсов ?
                Сообщение отредактировано: scorpion -
                  Цитата scorpion @
                  Где конкретно предоставленный интерфейскласс противоречит концепции интерфейсов ?

                  Например, вот такой код не будет работать, так, как планировалось:
                  ExpandedWrap disabled
                    struct B
                    {
                       void SomeMethod1(/*...*/);
                       void SomeMethod2(/*...*/);
                    };
                     
                    struct D : B, ISomeInterface
                    {
                    };

                  D будет считаться абстрактным классом.
                    Цитата scorpion @
                    Где конкретно предоставленный интерфейскласс противоречит концепции интерфейсов ?

                    Тогда перепиши на C++ пример из этого поста: Delphi vs C++ vs C# (сообщение #3016643) , только без введения новых линий наследования.
                      Цитата Flex Ferrum @
                      Тогда перепиши на C++ пример из этого поста: Delphi vs C++ vs C# (сообщение #3016643) , только без введения новых линий наследования.

                      Так?
                      ExpandedWrap disabled
                        struct IFoo /*interface*/
                        {
                           virtual void Foo() = 0;
                           virtual void Bar() = 0;
                        };
                         
                        struct Base
                        {
                           void Foo() {/* something */}
                        };
                         
                        struct Derived : IFoo, Base
                        {
                           void Bar(){ /*something else*/ }
                           void Foo(){ Base::Foo(); }
                        };


                      Цитата D_KEY @
                      D будет считаться абстрактным классом.

                      А на шарпе или в делфи это все отработает без ошибок хочешь сказать? Компилятор сам реализует методы интерфейса чтоле?
                        Цитата scorpion @
                        А на шарпе или в делфи это все отработает без ошибок хочешь сказать? Компилятор сам реализует методы интерфейса чтоле?

                        В дельфях - не знаю, а вот Шарп - он да. Он сам свяжет методы из интерфейса с методами из базового класса. Без участия разработчика.
                          Цитата Flex Ferrum @
                          В дельфях - не знаю, а вот Шарп - он да. Он сам свяжет методы из интерфейса с методами из базового класса. Без участия разработчика.

                          Не, я именно про код который привел D_KEY, заметь у него ни в классе B, ни в классе D нет реализаций методов.
                          А касательно этого примера, ну свяжет, и что? Я это сделал вручную. К тому же, если оно делает это все автоматом, без предупреждений, мне кажется можно и отгребсти. Я точно знаю, что без реализации метода Foo, я не смогу создать объект класса Derived, и компилятор мне подскажет это в виде ошибки, даже если я случайно упущу этот момент. И я тут же реализую его как мне нужно, либо вызову из базового класса, либо реализую непосредственно свой. А вот как быть если на шарпе я не хочу чтобы оно мне связывало? Упустил момент, компилится, работает вроде все нормально. А потом оказалось что я не тот метод использую, так?

                          Добавлено
                          Кстати, а где собственно этот синтаксический сахар, привязывается к концепции интерфейсов? Речь шла ведь как раз таки о концепции, а не о каких то частных выдуманных случаях. Покажите мне?
                          Сообщение отредактировано: scorpion -
                            Цитата scorpion @
                            А касательно этого примера, ну свяжет, и что? Я это сделал вручную. К тому же, если оно делает это все автоматом, без предупреждений, мне кажется можно и отгребсти. Я точно знаю, что без реализации метода Foo, я не смогу создать объект класса Derived, и компилятор мне подскажет это в виде ошибке, даже если я случайно упущу этот момент. И я тут же реализую его как мне нужно, либо вызову из базового класса, либо реализую непосредственно свой. А вот как быть если на шарпе я не хочу чтобы оно мне связывало? Упустил момент, компилится, работает вроде все нормально. А потом оказалось что я не тот метод использую, так?

                            Зависит от семантики термина "интерфейс". По факту, у тебя объект реализует все методы интерфейса. Только часть непосредственно, а другую - унаследованно. Следовательно (по факту) требуемый интерфейс поддерживается. А если тебя не удовлетворяет реализация интерфейсного метода из базового класса - ты всегда можешь её заменить. Тут дело не в "забывчивости".
                              Цитата scorpion @
                              я именно про код который привел D_KEY, заметь у него ни в классе B, ни в классе D нет реализаций методов.

                              Почему нет :blink: ?
                              Ты видишь в B абстрактные методы?

                              Цитата
                              А вот как быть если на шарпе я не хочу чтобы оно мне связывало?
                              Странно.

                              Добавлено
                              Цитата scorpion @
                              Кстати, а где собственно этот синтаксический сахар, привязывается к концепции интерфейсов?

                              Разница в том, что нет наследования. Класс не наследует интерфейс, а реализует его. Кстати, и то, чтобы метод класса, реализующий метод интерфейса, был виртуальным, не требуется.
                                Цитата Flex Ferrum @
                                Зависит от семантики термина "интерфейс". По факту, у тебя объект реализует все методы интерфейса.

                                Да, именно. Есть конкретный интерфейс, для него есть конкретный набор классов, который гарантированно должен реализовать все методы интерфейса.

                                Цитата Flex Ferrum @
                                Только часть непосредственно, а другую - унаследованно.

                                Но ведь нужно понимать, что это своего рода синтаксический сахар. Ведь, может возникнуть неоднозначная ситуация, когда ты наследуешься от интерфейса и двух классов, и при этом эти классы никак не наследуются от интерфейса, но при этом во всех трех сущностях присутствует метод Foo, тогда как автоматически связывать? Имеено по этому в С++ этот подход не требуется, имхо. Но это никак не противоречит концепции интерфейсов. Я нигде не встречал в описании интерфейсов именно такой отличительной черты от абстрактных классов. Это синтаксический сахар и не более, я так считаю.

                                Добавлено
                                Цитата D_KEY @
                                Почему нет :blink: ?
                                Ты видишь в B абстрактные методы?

                                Я не вижу их реализации. В С++ ты просто получишь ошибку линковки, если даже просто начнешь использовать объекты класса B, естественно вызывая методы которые не имеют реализации .

                                Цитата D_KEY @
                                Странно.

                                Что именно странного?

                                Цитата D_KEY @
                                Разница в том, что нет наследования. Класс не наследует интерфейс, а реализует его.

                                А где написанно что класс реализует интерфейс, если это вообще две разные сущности, которые могут быть попросту разными библиотеками разных компаний?

                                Цитата D_KEY @
                                Кстати, и то, чтобы метод класса, реализующий метод интерфейса, был виртуальным, не требуется.

                                Кстати в С++ тоже самое, чтобы метод класса, реализующий метод интерфейса был виртуальным, не требуется.
                                Сообщение отредактировано: scorpion -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 300 301 [302] 303 304 ...  494 495


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