
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.175] |
![]() |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
![]() |
|
|
Есть наследник от TObjectList:
![]() ![]() 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 глобальной? |
Сообщ.
#2
,
|
|
|
функция <> метод
|
Сообщ.
#3
,
|
|
|
Цитата Domino @ функция <> метод Ну так как передать, не ужели глобальную ф-цию заводить? |
Сообщ.
#4
,
|
|
|
Так у тебя Sort че принимает то? И че ты туда передаешь?
Она у тебя принимает функцию, а не метод. Ты же наследника делаешь, ну сделай, что бы он у тебя метод принимал, а предку функцию сделай, которая этот метод вызывать будет. |
Сообщ.
#5
,
|
|
|
Цитата Felan @ Type TCompareFunction = function(Item1, Item2: Pointer) of object; Передавать нужно простую функцию, а не метод. ![]() ![]() type TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer; Добавлено Цитата DelphiLexx @ Неужели я должен делать Compare глобальной? Что значит глобальной? |
Сообщ.
#6
,
|
|
|
Цитата Felan @ Она у тебя принимает функцию, а не метод. Ты же наследника делаешь, ну сделай, что бы он у тебя метод принимал, а предку функцию сделай, которая этот метод вызывать будет. Что-то не совсем понял, можно на примере Добавлено Цитата Демо @ Передавать нужно простую функцию, а не метод. Понимаешь, я не хочу отделять ф-цию Compare от класса, мне не хотелось бы в моем классе, у которого есть метод Sort, чтобы он использовал вещи лежащие вне класса. Добавлено Цитата Демо @ Что значит глобальной? Как что, глобальная ф-ция - это ф-ция объявленная в секции interface и реализованная в секции implementation'a и не являющаяся методом какого-либо класса. |
Сообщ.
#7
,
|
|
|
Объяви ее только в implementation.
|
Сообщ.
#8
,
|
|
|
Цитата Romkin @ Объяви ее только в implementation. Не хотел бы я использовать в Sort, то что не принадлежит классу, не граммотно это. |
Сообщ.
#9
,
|
|
|
Цитата DelphiLexx @ Не хотел бы я использовать в Sort, то что не принадлежит классу, не граммотно это. Почему неграмотно? Как раз грамотно, когда функция сравнения - общая, и может использоваться разными классами. Строка ведь остается строкой, неважно, какому классу она принадлежит. И функцию сравнения строк делают общей. |
Сообщ.
#10
,
|
|
|
Цитата DelphiLexx @ Абсолютно согласен с этим утверждением. не граммотно это |
Сообщ.
#11
,
|
|
|
Цитата Domino @ Абсолютно согласен с этим утверждением Ну значит сортировку вручную реализовывать. Либо второй вариант - принять, что не класс является единицей реализации, а и модуль, в котором он описан. |
Сообщ.
#12
,
|
|
|
Цитата Domino @ Абсолютно согласен с этим утверждением. И зря. Какое отношение имеет оператор сравнения к контейнеру?! |
Сообщ.
#13
,
|
|
|
Цитата Domino @ Цитата (DelphiLexx @ Сегодня, 14:55) не граммотно это Абсолютно согласен с этим утверждением. Тоже согласен, но что поделать, если в данном случае в базовом классе именно функция? Не уверен, но может быть так попробовать: ![]() ![]() inherited Sort(TMethod(Compare).Code); //здесь на этапе компиляции возникает ошибка |
![]() |
Сообщ.
#14
,
|
|
Цитата Felan @ inherited Sort(TMethod(Compare).Code); //здесь на этапе компиляции возникает ошибка проверять лень, но по идее не должно быть ошибке на этапе компиляции.. Тока в run-time av'шка какая нить возникнет. |
Сообщ.
#15
,
|
|
|
Угу... возникает...
Ну, если сделать доступ потокобезопасный к Sort, то можно так извращьнуться ![]() ![]() ![]() 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. Тогда получится что в наследнике как раз метод... |