На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> [Delphi] Методы vs функции, классовые vs статик методы и всё остальное.
    Есть наследник от TObjectList:
    ExpandedWrap disabled
      type
        TMyList = class(TObjectList)
        private
          FSign: integer;
          function Compare(Item1, Item2: Pointer): Integer;
        public
           procedure Sort(aSign); overload;
        end;  
      ...
      function TMyList.Compare(Item1, Item2: Pointer): Integer;
      begin
       
        if FSign > 0 then
          Result :=...
        else
          ...
      end
       
      procedure TMyList.Sort(aSign); overload;
      begin
       
        FSign := aSign;
        inherited Sort(Compare); //здесь на этапе компиляции возникает ошибка
      end;

    Проблема в том, что при передаче в Sort ф-ции Compare возникает ошибка как быть? Неужели я должен делать Compare глобальной?
    Сообщение отредактировано: jack128 -
      функция <> метод
        Цитата Domino @
        функция <> метод

        Ну так как передать, не ужели глобальную ф-цию заводить?
          Так у тебя Sort че принимает то? И че ты туда передаешь?

          Она у тебя принимает функцию, а не метод. Ты же наследника делаешь, ну сделай, что бы он у тебя метод принимал, а предку функцию сделай, которая этот метод вызывать будет.
          Сообщение отредактировано: Felan -
            Цитата Felan @
            Type
            TCompareFunction = function(Item1, Item2: Pointer) of object;


            Передавать нужно простую функцию, а не метод.

            ExpandedWrap disabled
              type TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;


            Добавлено
            Цитата DelphiLexx @
            Неужели я должен делать Compare глобальной?


            Что значит глобальной?
              Цитата Felan @
              Она у тебя принимает функцию, а не метод. Ты же наследника делаешь, ну сделай, что бы он у тебя метод принимал, а предку функцию сделай, которая этот метод вызывать будет.

              Что-то не совсем понял, можно на примере

              Добавлено
              Цитата Демо @
              Передавать нужно простую функцию, а не метод.

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

              Добавлено
              Цитата Демо @
              Что значит глобальной?

              Как что, глобальная ф-ция - это ф-ция объявленная в секции interface и реализованная в секции implementation'a и не являющаяся методом какого-либо класса.
                Объяви ее только в implementation.
                  Цитата Romkin @
                  Объяви ее только в implementation.

                  Не хотел бы я использовать в Sort, то что не принадлежит классу, не граммотно это.
                    Цитата DelphiLexx @
                    Не хотел бы я использовать в Sort, то что не принадлежит классу, не граммотно это.

                    Почему неграмотно? Как раз грамотно, когда функция сравнения - общая, и может использоваться разными классами. Строка ведь остается строкой, неважно, какому классу она принадлежит. И функцию сравнения строк делают общей.
                      Цитата DelphiLexx @
                      не граммотно это
                      Абсолютно согласен с этим утверждением.
                        Цитата Domino @
                        Абсолютно согласен с этим утверждением


                        Ну значит сортировку вручную реализовывать.

                        Либо второй вариант - принять, что не класс является единицей реализации, а и модуль, в котором он описан.
                          Цитата Domino @
                          Абсолютно согласен с этим утверждением.

                          И зря. Какое отношение имеет оператор сравнения к контейнеру?!
                            Цитата Domino @
                            Цитата (DelphiLexx @ Сегодня, 14:55)
                            не граммотно это
                            Абсолютно согласен с этим утверждением.

                            Тоже согласен, но что поделать, если в данном случае в базовом классе именно функция?

                            Не уверен, но может быть так попробовать:
                            ExpandedWrap disabled
                              inherited Sort(TMethod(Compare).Code); //здесь на этапе компиляции возникает ошибка
                              Цитата Felan @
                              inherited Sort(TMethod(Compare).Code); //здесь на этапе компиляции возникает ошибка


                              проверять лень, но по идее не должно быть ошибке на этапе компиляции.. Тока в run-time av'шка какая нить возникнет.
                                Угу... возникает...
                                Ну, если сделать доступ потокобезопасный к Sort, то можно так извращьнуться :)

                                ExpandedWrap disabled
                                  unit Unit7;
                                   
                                  interface
                                   
                                  uses
                                    Contnrs;
                                   
                                  type
                                    TMyCompareFunction = function(aItem1: Pointer; aItem2: Pointer): integer of object;
                                   
                                    TMyObjectList = class(TObjectList)
                                      procedure Sort(aCompareFunction: TMyCompareFunction); reintroduce;
                                    end;
                                   
                                   
                                  implementation
                                   
                                  var
                                    vCF: TMyCompareFunction;
                                   
                                  function cmp(aItem1: Pointer; aItem2: Pointer): integer;
                                  begin
                                    Result := vCF(aItem1, aItem2 );
                                  end;
                                   
                                  { TMyObjectList }
                                   
                                  procedure TMyObjectList.Sort(aCompareFunction: TMyCompareFunction);
                                  begin
                                    vCF := aCompareFunction;
                                    inherited Sort(cmp);
                                  end;
                                   
                                  end.


                                Тогда получится что в наследнике как раз метод...
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0372 ]   [ 14 queries used ]   [ Generated: 12.07.25, 18:25 GMT ]