Может кто знает принцип взаимодействия наследованных структур, ибо столкнулся с такой проблемой:
struct Tracker
static method create takes real x, real y, string rpath, integer p returns Tracker
...
set trk.tr = CreateTrackable(rpath,x,y,0)
set trk.t_track = CreateTrigger()
call TriggerRegisterTrackableTrackEvent(trk.t_track,trk.tr)
call TriggerAddAction(trk.t_track,function Tracker.defaultTrack)
call DisableTrigger(trk.t_track)
call SaveInteger(hash,H2I(trk.tr),1,trk)
...
endmethod
stub method OnTrack takes nothing returns nothing
echo("track1")
endmethod
static method defaultTrack takes nothing returns nothing
Tracker(LoadInteger(hash,H2I(GetTriggeringTrackable()),1)).OnTrack()
endmethod
endstruct
struct Button extends Tracker
stub method OnTrack takes nothing returns nothing
echo("track2")
endmethod
endstruct
хочу переопределить OnTrack но получается что приведение типа в статическом методе defaultTrack указывает четко имя структуры(не знаю как иначе сделать), метод которой будет вызван, т.е. по дефолту при наведение на трекебл выведется "track1", если же я в defaultTrack сделаю приведение типа Button то выведется "track2", но Tracker не должен знать о своих детях, потому вопрос в том, можно ли с помощью структур реализовать наследование экшенов или как привести тип к актуальному, а не конкретному?
Возможно я что-то упускаю.
Возможно я что-то упускаю.
Принятый ответ
да вот только thistype возвращает структуру из которой он вызван, а не структуру инстанса идентификатора, т.е. getTrack будет всегда возвращать тип Tracker. Вопрос в том, как по идентификатору определить конкретный тип структуры и к нему привести.
Этот код тестировал? Он должен работать.
Структуры в vJass - массивы. Объект структуры - integer.
У каждой структуры есть массив, куда записывается тип каждого объекта структуры. Пусть у Trackle айди 1, а у Button 2. При создании объекта структуры будет сделано следующее: set массив_куда_записывается_тип[объект_структуры] = айди_структуры. При создании объекта Button и в массив типа структуры Button, и в массив структуры Trackle будет записано 2.
Перезаписываемые методы - массив триггеров, у которых в качестве условия записано тело метода.
Вызов такого метода - call TriggerEvaluate(массив_триггеров[массив_куда_записывается_тип[объект_структуры]]).
В нашем случае это будет выглядеть call TriggerEvaluate(массив_триггеров_OnTrack[массив_куда_записывается_тип[getTrack(h)]]).
У каждой структуры есть массив, куда записывается тип каждого объекта структуры. Пусть у Trackle айди 1, а у Button 2. При создании объекта структуры будет сделано следующее: set массив_куда_записывается_тип[объект_структуры] = айди_структуры. При создании объекта Button и в массив типа структуры Button, и в массив структуры Trackle будет записано 2.
Перезаписываемые методы - массив триггеров, у которых в качестве условия записано тело метода.
Вызов такого метода - call TriggerEvaluate(массив_триггеров[массив_куда_записывается_тип[объект_структуры]]).
В нашем случае это будет выглядеть call TriggerEvaluate(массив_триггеров_OnTrack[массив_куда_записывается_тип[getTrack(h)]]).
Потому должно работать.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован exAres
Отредактирован PT153
У каждой структуры есть массив, куда записывается тип каждого объекта структуры. Пусть у Trackle айди 1, а у Button 2. При создании объекта структуры будет сделано следующее: set массив_куда_записывается_тип[объект_структуры] = айди_структуры. При создании объекта Button и в массив типа структуры Button, и в массив структуры Trackle будет записано 2.
Перезаписываемые методы - массив триггеров, у которых в качестве условия записано тело метода.
Вызов такого метода - call TriggerEvaluate(массив_триггеров[массив_куда_записывается_тип[объект_структуры]]).
В нашем случае это будет выглядеть call TriggerEvaluate(массив_триггеров_OnTrack[массив_куда_записывается_тип[getTrack(h)]]).
Отредактирован PT153
правьте рукикинь свой код Tracker и его детей в мне в ЛС. Я уж гляну, что к чему.код работает
Отредактирован PT153
То есть даже код из вопроса работает, как нужно.
Небольшой совет: определение метода нужно писать над кодом, в котором этот метод передаётся как code, иначе на самом деле будет передана функция, что вызывает триггер, в котором уже вызывается указанный метод.