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

      Вообще-то такую ситуацию со свойствами мне вообразить трудно. protected же предусматривает прежде всего что используется потомками, менять реализацию без учета этого доступа коряво.
      Фактически объявляется просто проброс, зачем двоить методы, когда понятно что обращение в них будет опять же к протектед методам предка?
      По-твоему, у предка в протектед getCaption/setCaption, и чтобы опубликовать, я должен в потомке в паблике объявить свои методы getCaption/setCaption, которые просто обращаются к протектед предка? Занафига?
        Цитата korvin @
        что? он обещает, что ни у кого нет доступа к этим данным, кроме методов этого же класса.

        Ты не понял? Ты предлагаешь реализацию оформить прямо в публичном интерфейсе, завязав на ней последующий клиентский код.
          DesweR, к вопросу о сравнениях. Delphi может так, как описано мною здесь?
            Цитата Flex Ferrum @
            Цитата DesweR @
            Flex Ferrum
            А что-нибудь такое? :)

            Ну, шарп (ЕМНИП) такого не поддерживает. Моя реализация свойств - могёт. А что-нибуть такое:

            ExpandedWrap disabled
              class IUnit
              {
              public:
                 PROPERTIES(IUnit, // В интерфейсе объявляем набор RO-свойств
                    ABSTRACT_RO_PROPERTY(IWizard*, Owner)
                    ABSTRACT_RO_PROPERTY(IRace*, Race)
                    ABSTRACT_RO_PROPERTY(StatsTuple&, Stats)
                 );
              };
               
              class Unit : public IUnit
              {
              public:
                 PROPERTIES(Unit, // Имплементируем их как R/W-свойства
                    IMPLEMENT_PROPERTY(IUnit, PROPERTY(IWizard*, Owner))
                    IMPLEMENT_PROPERTY(IUnit, PROPERTY(IRace*, Race))
                    IMPLEMENT_PROPERTY(IUnit, PROPERTY(StatsTuple&, Stats))
                 );
              };


            Таким образом получаем, что внешние клиенты системы работают с ReadOnly-свойствами. А внутри системы требования менее жёсткие, и те же самые свойства можно ещё и писать.
            Интерфейс непрозрачен. Т. е. перейти от него к реализации - нельзя...

            Можно, если правильно понял.
            ExpandedWrap disabled
                TAncestor = class
                protected
                  FCaption: string;
                  FLength: Integer;
                public
                  property Caption: string read FCaption write FCaption;
                  property Length: Integer read FLength write FLength;
                end;
               
                TDerived = class(TAncestor)
                public
                  property Caption: string read FCaption;
                  property Length: Integer read FLength;
                end;
              Цитата DesweR @
              Можно, если правильно понял.

              Не, не совсем правильно. IUnit - это интерфейс (базовый класс), содержащий ряд абстрактных свойств (т. е. сам он эти свойства не реализует). Он отдаётся за пределы некоей библиотеки. Unit - это его реализация, которая используется внутри библиотеки, и предоставляет внутренним клиентам более широкий функционал...
                Цитата DesweR @
                Ты не понял? Ты предлагаешь реализацию оформить прямо в публичном интерфейсе, завязав на ней последующий клиентский код.

                где это я такое предлагал?

                Добавлено
                Цитата Romkin @
                По-твоему, у предка в протектед getCaption/setCaption, и чтобы опубликовать, я должен в потомке в паблике объявить свои методы getCaption/setCaption, которые просто обращаются к протектед предка? Занафига?

                по-моему в данном случае у предка getCaption/setCaption должно быть в паблик или не быть вообще.
                  Цитата korvin @
                  где это я такое предлагал?

                  Цитата korvin @
                  а зачем нужны приватные поля, к которым есть доступ извне? делайте публичное поле
                    Цитата Flex Ferrum @
                    DesweR, к вопросу о сравнениях. Delphi может так, как описано мною здесь?

                    Чисто свойствами - вроде бы нет. Если я правильно понимаю отношение "для чтения". Собственно, это делается через методы.
                    Точнее, если я правильно интерпретировал:
                    ExpandedWrap disabled
                      type
                        IUnit = interface
                          function GetWizard: IWizard;
                          ...
                          property Wizard: IWizard read GetWizard;
                        end;
                        
                        TUnit = class(..., IUnit)
                        ...
                          function GetWizard: IWizard; //for IUnit
                          procedure SetWizard(const Value: IWizard);
                        ...
                          property Wizard: IWizard read GetWizard write SetWizard;
                        end;

                    Я оставил одно свойство, просто чтобы объяснить. Свойства просто разные, свойство класса не имеет никакого отношения к свойству интерфейса (то есть у класса оно может называться и CoolWizard или еще как, или отсутствовать).

                    Добавлено
                    Цитата korvin @
                    по-моему в данном случае у предка getCaption/setCaption должно быть в паблик или не быть вообще.

                    Совершенно не факт. В протектед почему не имеет право быть? Опять нарушение ООП?

                    Добавлено
                    Flex Ferrum, вот простенькое:
                    ExpandedWrap disabled
                      type
                        IVector = interface
                          function GetElem(Index: integer): Double;
                          procedure SetElem(Index: integer; Value: Double);
                          function GetSize: integer;
                       
                          property Elem[Index: integer]: Double read GetElem write SetElem; default;
                          property Size: integer read GetSize;
                        end;
                       
                        TVectorArray = array of Double;
                       
                        TVector = class(TInterfacedObject, IVector)
                        private
                          FVector: TVectorArray;
                        protected
                          function GetElem(Index: integer): Double;
                          procedure SetElem(Index: integer; Value: Double);
                          function GetSize: integer;
                        public
                          constructor Create(ASize: integer);
                        end;
                       
                      ...
                       
                      var
                        Vector: IVector;
                        i: integer;
                      begin
                        Vector := TVector.Create(3);
                        Vector[0] := 1;
                        Vector[1] := 2;
                        Vector[2] := 3;
                        for i := 0 to Vector.Size - 1 do
                          Vector[i] := Vector[i] + 1;
                      ...
                      Цитата korvin @
                      Цитата Romkin @
                      По-твоему, у предка в протектед getCaption/setCaption, и чтобы опубликовать, я должен в потомке в паблике объявить свои методы getCaption/setCaption, которые просто обращаются к протектед предка? Занафига?

                      по-моему в данном случае у предка getCaption/setCaption должно быть в паблик или не быть вообще.

                      Простой пример: пишем свой компонент TMyStatusBar, наследуется от TCustomPanel и переносим из протектед в публишед все свойства окромя Aligh, Height, Weigth.
                        Цитата Romkin @
                        Я оставил одно свойство, просто чтобы объяснить. Свойства просто разные, свойство класса не имеет никакого отношения к свойству интерфейса (то есть у класса оно может называться и CoolWizard или еще как, или отсутствовать).

                        Ага. Только вместе со свойством у тебя появляется виртуальный метод. У меня - нет. :)
                          Цитата Flex Ferrum @
                          Ага. Только вместе со свойством у тебя появляется виртуальный метод. У меня - нет.

                          Не виртуальный. А так - да, интерфейс это структура с методами (только), можно обращаться как к свойствам, так и к методам.
                          А как насчет default? Обрати внимание на Vector[0] := 1;
                            Цитата DesweR @
                            Цитата korvin @
                            а зачем нужны приватные поля, к которым есть доступ извне? делайте публичное поле

                            ты не прочитал вопрос в моем предложении? не я собирался делать публичные поля, к которым есть доступ извне
                              Цитата korvin @
                              ты не прочитал вопрос в моем предложении? не я собирался делать публичные поля, к которым есть доступ извне

                              Ну вот, сам не собираешься, а других подталкиваешь. Нехорошо!
                                Цитата Romkin @
                                Совершенно не факт. В протектед почему не имеет право быть? Опять нарушение ООП?

                                но зачем? зачем захламлять базовый класс? зачем одним классом решать все задачи?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (495) « Первая ... 297 298 [299] 300 301 ...  494 495


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