Автор | Сообщение |
|
| Администратор
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 21.03.06 14:06. Заголовок: Классы
Harbour Надо в существующий класс добавить в runtime несколько методов Для этого есть метод AddMethod: oClass:AddMethod( "Show", @Show() ) Как получить доступ к oClass ? Вызов MyClass() дает oClass::Instance()
|
|
|
Ответов - 7
[только новые]
|
|
|
| постоянный участник
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 21.03.06 14:49. Заголовок: Re:
Павел, я на Harbour не программировал, тем не менее наберусь смелость высказать свои кривые мысли. При создании (определении) класса создается статическая переменная типа Handle (как в Windows) и далее все действия по дальнейшему определению данного класса базируются на этой статической переменной. Как следует из модуля hbclass.ch эта переменная носит название s_oClass. То есть, если вы имеете исходный текст модуля, в котором определен класс, то вы можете туда добавить свои методы. Если же нет, то должна быть в Harbour функция (по аналогии с классами в Clipper), которая по названию класса должна возвращать значение этого Handle. А далее все просто. Есть еще возможность - это создать свой производный класс от данного класса и добавить в него свои методы или переопределить методы базового класса. Но проще всего, как я сказал, по названию класса получить его Handle. Так мне ка-а-жется...
|
|
|
|
| Администратор
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 21.03.06 15:03. Заголовок: Re:
Может метод Instance() ее и возвращает, проверю
|
|
|
|
| постоянный участник
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 21.03.06 15:28. Заголовок: Re:
Вообще-то, это должна быть обычная функция, возвращающая по названию класса его Handle (то есть целое число, представляющее собой по существу порядковый номер класса), а не метод класса. Не знаю, как в Harbour, но в Clipper реализован только один "автоматический" метод, который не обязательно самому писать. Это метод QSELF():CLASSNAME().
|
|
|
|
| постоянный участник
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 21.03.06 15:39. Заголовок: Re:
Проверьте, по-моему в Harbour членом каждого клааса является oObject:ClassH. ClassH - это и есть необходимый Handle. А вот и функция, которая все делает FUNCTION __objAddMethod( oObject, cSymbol, nFuncPtr ) IF !ISOBJECT( oObject ) .OR. !ISCHARACTER( cSymbol ) .OR. !ISNUMBER( nFuncPtr ) __errRT_BASE( EG_ARG, 3101, NIL, ProcName( 0 ) ) ELSEIF !__objHasMsg( oObject, cSymbol ) __clsAddMsg( oObject:ClassH, cSymbol, nFuncPtr, HB_OO_MSG_METHOD, NIL, 1 ) ENDIF RETURN oObject
|
|
|
|
| Администратор
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 21.03.06 15:48. Заголовок: Re:
Да, оказывается в Harbour для этих целей и команда есть: EXTEND CLASS ... но мне еще надо тоже самое для fw for clipper, для совместимости
|
|
|
|
| постоянный участник
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 21.03.06 15:57. Заголовок: Re:
Нет под рукой FiveWin, но в FiveWin вполне возможно, что функции по работе с объектами лежат в модуле, который по аналогии с Clipper, называется SEND (.С - ?)
|
|
|
|
| постоянный участник
|
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 21.03.06 16:01. Заголовок: Re:
А скорей всего исходник модуля SEND в FiveWin закрыт, так как это было know-how Антонио Линареса. Там уже фокус с oObject:ClassH может не пройти. Это лекго проверить. Просто задать для любого объекта ? oObject:ClassH Если не обругает, то значит все нормально. Если обругает, то есть стандартные функции Clipper (к сожалению недокументированные) по добавлению в класс метода.
|
|
|
|