On-line: Andrey, Dr. Oldwarez, гостей 0. Всего: 2 [подробнее..]
АвторСообщение
Администратор




Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 21.03.06 14:06. Заголовок: Классы


Harbour

Надо в существующий класс добавить в runtime несколько методов

Для этого есть метод AddMethod:

oClass:AddMethod( "Show", @Show() )

Как получить доступ к oClass ?

Вызов MyClass() дает oClass::Instance()


Спасибо: 0 
Профиль
Ответов - 7 [только новые]


постоянный участник


Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 21.03.06 14:49. Заголовок: Re:


Павел, я на Harbour не программировал, тем не менее наберусь смелость высказать свои кривые мысли.
При создании (определении) класса создается статическая переменная типа Handle (как в Windows) и далее все действия по дальнейшему определению данного класса базируются на этой статической переменной. Как следует из модуля hbclass.ch эта переменная носит название s_oClass. То есть, если вы имеете исходный текст модуля, в котором определен класс, то вы можете туда добавить свои методы. Если же нет, то должна быть в Harbour функция (по аналогии с классами в Clipper), которая по названию класса должна возвращать значение этого Handle. А далее все просто.
Есть еще возможность - это создать свой производный класс от данного класса и добавить в него свои методы или переопределить методы базового класса.
Но проще всего, как я сказал, по названию класса получить его Handle.
Так мне ка-а-жется...

Спасибо: 0 
Профиль
Администратор




Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 21.03.06 15:03. Заголовок: Re:


Может метод Instance() ее и возвращает, проверю

Спасибо: 0 
Профиль
постоянный участник


Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 21.03.06 15:28. Заголовок: Re:


Вообще-то, это должна быть обычная функция, возвращающая по названию класса его Handle (то есть целое число, представляющее собой по существу порядковый номер класса), а не метод класса. Не знаю, как в Harbour, но в Clipper реализован только один "автоматический" метод, который не обязательно самому писать. Это метод QSELF():CLASSNAME().

Спасибо: 0 
Профиль
постоянный участник


Не зарегистрирован
Зарегистрирован: 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


Спасибо: 0 
Профиль
Администратор




Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 21.03.06 15:48. Заголовок: Re:


Да, оказывается в Harbour для этих целей и команда есть:

EXTEND CLASS ...

но мне еще надо тоже самое для fw for clipper, для совместимости


Спасибо: 0 
Профиль
постоянный участник


Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 21.03.06 15:57. Заголовок: Re:


Нет под рукой FiveWin, но в FiveWin вполне возможно, что функции по работе с объектами лежат в модуле, который по аналогии с Clipper, называется SEND (.С - ?)

Спасибо: 0 
Профиль
постоянный участник


Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 21.03.06 16:01. Заголовок: Re:


А скорей всего исходник модуля SEND в FiveWin закрыт, так как это было know-how Антонио Линареса. Там уже фокус с oObject:ClassH может не пройти. Это лекго проверить. Просто задать для любого объекта ? oObject:ClassH Если не обругает, то значит все нормально. Если обругает, то есть стандартные функции Clipper (к сожалению недокументированные) по добавлению в класс метода.

Спасибо: 0 
Профиль
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 119
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет