forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=109)
-   -   TMethod? (http://forum.boolean.name/showthread.php?t=8304)

Randomize 17.05.2009 08:37

TMethod?
 
Можно ли в BlitzMax передавать в тип функцию или метод?
Образный код:
Код:

Type TAssa
 Field Draw:TMethod
 Field oppa:Int

 Method Preved()
  '...work in progress
 EndMethod
EndType

assa:TAssa=New TAssa
assa.Draw=SuperPuperDraw()

Repeat
 assa.Preved()
 assa.Draw()
Forever


jimon 17.05.2009 12:42

Ответ: TMethod?
 
может тебе нужно наследование ? потому что то что ты хочешь почти не применяется в ООП

Код:

Type TDrawObject
  Method Draw() Abstract
EndType

Type TAssa Extends TDrawObject
  Method Draw()
    ' special draw code
  EndMethod
EndType

таким же способом если описать Draw у TDrawObject то его можно вызывать из Draw в TAssa

dimanche13 18.05.2009 11:14

Ответ: TMethod?
 
можно сделать поле как указатель на функцию. А вообще непойму как ты хочешь метод использовать без объекта?

Randomize 20.05.2009 23:55

Ответ: TMethod?
 
2Jimon : не, через наследование я не хотел делать.
На самом деле меня просто привлёк тип TMethod ;)

2dimanche13 : Да допустим Java ADA или PHP поддерживают передачу функции откуда угодно в тип (даже через функцию).
Чтото типа:

Код:

function assa(p1,p2)
{
 return p1+p2;
};
Tassa.Create(1,2,3,function assa(p1,p2), true)

Или

Код:

Tassa.Create(1,2,3,function (p1,p2){
 return p1+p2;
}, true)


dimanche13 21.05.2009 11:23

Ответ: TMethod?
 
вообще-то метод- это функция в типе, просто ее первый параметр сам объект(self).

Randomize 21.05.2009 18:09

Ответ: TMethod?
 
Цитата:

вообще-то метод- это функция в типе, просто ее первый параметр сам объект(self).
Не понял ход мысли...
Это и так понятно, но я говорю не про то. Я имел в виду транспортировку функции или метода как обьекта.

dimanche13 21.05.2009 21:31

Ответ: TMethod?
 
объясни на пальцах что тебе надо сделать.

Randomize 22.05.2009 08:53

Ответ: TMethod?
 
На самом деле мне было просто интересно что за тип TMethod.
Вот я и подумал неужели в BlitzMax можно создавать функции-кочевники.

dimanche13 22.05.2009 13:13

Ответ: TMethod?
 
TMethod это один из элементов "отражения"(reflection). Он служит для того чтобы можно было узнать по объекту, какими методами он обладает и какие параметры эти методы принимают. Так же возможен вызов этих методов.
на счет функций кочевников можно сказать одно. Без проблем делается массив функций в типе и ты эти функции можешь инициализировать из вне.

Randomize 24.05.2009 22:33

Ответ: TMethod?
 
массив функций в типе...
Можно больше деталей? Это любопытно.

jimon 24.05.2009 22:58

Ответ: TMethod?
 
ну вот к примеру указатель на функцию
Код:

        Method AddFunction(func:Int(ls:Byte Ptr), name:String)
                If (m_started)
                        lua_register(m_lua_state, name, func)
                End If
        End Method


dimanche13 24.05.2009 23:24

Ответ: TMethod?
 
Цитата:

Сообщение от Randomize (Сообщение 105724)
массив функций в типе...
Можно больше деталей? Это любопытно.

ну очень просто.
пример собран на коленке, не проверял.

Код:

SuperStrict

Type myType

        Field callback()[]

        Method add_function( num:Int, func() )

                If( callback.length - 1 < num ) Then
                        callback = callback[ .. num + 1]
                End If

                callback[ num ] = func
        End Method

        Method run_all()
                For Local func() = EachIn callback
                        func()
                Next
        End Method

End Type

Function func_1()
        Print "func_1"
End Function       

Function func_2()
        Print "func_2"
End Function       

Function func_3()
        Print "func_3"
End Function       

Local bugoga:myType = New myType

bugoga.add_function( 0 , func_1 )
bugoga.add_function( 1 , func_2 )
bugoga.add_function( 2 , func_3 )
bugoga.add_function( 3 , func_1 )

bugoga.run_all() ' пройдемся по всем функциям

end

блин поставил намедни 1.33 рс5 и перестала документация компилиться, а потом и всё перестало компилиться. Жалуется на шквал. Но я его блин даже не юзал никогда, тока проверял враппер. Может скажет кто как починить? Я уже на 1.30 откатился - та же фигня...

Randomize 26.05.2009 06:07

Ответ: TMethod?
 
dimanche13, спасибо большое! Именно это мне и было интересно.

Косательно твоей проблемы:
я использую версию 1.30, такой же глюк был. Помогло лишь тотальное удаление папки BlitzMax с корнем и последующая переустановка.
После систематических вылетов, глюков и лагов BlitzMax выяснил, что это происходит изза наличия вирусов на машине. После глубокого скана, переустановки ОС и повторного полного скана больше таких глюков не замечал. Проверь, может вирусы.

dimanche13 26.05.2009 11:59

Ответ: TMethod?
 
Переставил ОСь - все по прежнему, вирусов -нет 99%. Осталось вариант с полным удалением попробовать...

SBJoker 26.05.2009 12:02

Ответ: TMethod?
 
К сожалению перестановка оси не избавляет от вирусов.
От них спасает форматирование дисков и запись только проверенных файлов и программ. Или банально использовать любой антивирус хотя бы в триальном режиме ;)


Часовой пояс GMT +4, время: 17:35.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot