Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > BlitzMax > 2D-программирование

Ответ
 
Опции темы
Старый 16.11.2008, 20:53   #16
dimanche13
Мастер
 
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений
(для 252 пользователей)
Ответ: Как узать объект?

oxid я это все знаю, спасибо. Сделал, наследованием от базового типа.
К тому же сделал класс, в котором можно добавлять типы и методы динамически во время выполнения программы. Тип содержит 2 поля список_полей и список_методов, а так же методы добавления, удаления и вызова методов и параметров. Получилось довольно забавно.
SuperStrict

Type _Unknown

	Field fields_map:TMap = New Tmap
	Field methods_map:TMap = New TMap
	
	Method add_method( name:String , func_callback( o:_Unknown, params:Object[] ) )
		methods_map.insert( name , New _Method.Create( func_callback ) )
	End Method
	
	Method add_field( name:String, this_type:Object )
		fields_map.insert( name , this_type )
	End Method
	
	Method get_field:Object( name:String )
		If fields_map.contains( name ) Then Return fields_map.ValueForKey( name ) Else Return Null
	End Method
	
	Method set_field( name:String , this_type:Object )
		If fields_map.contains( name ) Then 
			fields_map.insert( name , this_type )
		End If	
	End Method
	
	Method rem_field( name:String )
		If fields_map.contains( name ) Then 
			fields_map.remove( name )
		End If
	End Method

	Method rem_method( name:String )
		If methods_map.contains( name ) Then 
			methods_map.remove( name )
		End If
	End Method
	
	Method call_method( name:String , params:Object[] = Null )
		Local this:_Method = New _Method
		
		If methods_map.contains( name ) 
			this = _Method( methods_map.ValueForKey( name ) )
		End If
			
		this.callback( Self, params )
	End Method
	
	Method print_all_fields()
		For Local name:String = EachIn fields_map.keys()
			Print name
		Next
	End Method
	
	Method print_all_methods()
		For Local name:String = EachIn methods_map.keys()
			Print name
		Next		
	End Method
	
	Method clear_fields()
		fields_map.clear()
	End Method
	
	Method clear_methods()
		methods_map.clear()
	End Method
	
End Type

Local obj:_Unknown = New _Unknown

obj.add_field("x", New _Float.Create( 0.3 ) )
obj.add_field("y", New _Float.Create( 0.7 ) )

obj.add_method("add_x_with_y", add_x_with_y )

obj.call_method("add_x_with_y")

obj.set_field("x" , New _Float.Create( 8.3 ) )

obj.call_method("add_x_with_y")

obj.print_all_fields()
obj.print_all_methods()

obj.call_method("add_x_with_y", [ New _Float.Create( 0.5 ) , New _Float.Create( 0.9 ) ] )

End

Function add_x_with_y( o:_Unknown, params:Object[] = Null )

	Local x:Float 
	Local y:Float 
	
	If( params = Null )
		x = _Float( o.get_field("x") ).value
		y = _Float( o.get_field("y") ).value
	Else
		x = _Float( params[0] ).value 
		y = _Float( params[1] ).value 
	End If	
	
	Print ( x + y )

End Function


Type _Method

	Field callback( o:_Unknown, params:Object[] )
	
	Method Create:_Method( func_callback( o:_Unknown, params:Object[] ) )
			callback = func_callback; Return Self
	End Method
	
End Type

Type _Type End Type

Type _Int Extends _Type
	Field value :Int
	
	Method Create:_Int( new_value:Int )
		value = new_value; Return Self
	End Method
	
	Method get:Int()
		Return value
	End Method	
End Type	

Type _Float Extends _Type
	Field value :Float
	
	Method Create:_Float( new_value:Float )
		value = new_value; Return Self
	End Method

	Method get:Float()
		Return value
	End Method	
End Type	

Type _Double Extends _Type
	Field value :Double

	Method Create:_Double( new_value:Double )
		value = new_value; Return Self
	End Method	

	Method get:Double()
		Return value
	End Method	
End Type	

Type _String Extends _Type
	Field value :String

	Method Create:_String( new_value:String )
		value = new_value; Return Self
	End Method

	Method get:String()
		Return value
	End Method	
End Type	

Type _Object Extends _Type
	Field value :Object

	Method Create:_Object( new_value:Object )
		value = new_value; Return Self
	End Method
	
	Method get:Object()
		Return value
	End Method	
End Type
__________________
(Offline)
 
Ответить с цитированием
Старый 17.11.2008, 07:46   #17
oxid
Нуждающийся
 
Регистрация: 20.08.2006
Сообщений: 54
Написано 3 полезных сообщений
(для 4 пользователей)
Re: Как узать объект?

Дык а что говоришь, что не решена?
Прикольно. Но не совсем оптимально. Я что-то подобное делал, только чуть по другому подошел к вопросу. Я функцию представил в виде класса, т.е. класс с одним методом CALL и массивом аргументов. Получается более обьекто-ориентировано. И код проще: имплиментируем нужные действия в наследнике класса функции - инициализировать с внешней функцией экземпляр не надо - просто создаем его и все. Можно еще синглтоном делать - будет типа меньше памяти занимать, но я с этим не заморачивался (там кое-что надо продумывать) и без синглтонов все нормально, если правильно организовать.
И еще насчет оптимизации (блин у тя оптимизировать и оптимизировать - хотел одно сказать, а там не одно):
1) If fields_map.contains( name ) Then - лишнее, сразу юзай fields_map.remove( name ) - лишнего не сотрет. Тоже и для методов. Проверку надо делать если действительно это надо (ну или для дебаг режима с проверкой) - значение возвращать там удален ли действительно или нет, но ИМО эт для отлдки надо обычно.
2) Обращение к динамическим полям и методам:
If methods_map.contains( name ) - не так - ты же дважды по списку проходишь и если он большой, то эт плохо.
Вот оптимальнее:
this = _Method( methods_map.ValueForKey( name ) )
if (this) then this.callback( Self, params );
Проверку на нуль быстрее делать, чем список проходить.
Вроде все
ЗЫ: а простые типы тоже в объекты оборачивал
(Offline)
 
Ответить с цитированием
Старый 17.11.2008, 10:50   #18
jimon
 
Сообщений: n/a
Ответ: Как узать объект?

нафига делать то что делает транслятор за вас ?
 
Ответить с цитированием
Старый 17.11.2008, 12:16   #19
dimanche13
Мастер
 
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений
(для 252 пользователей)
Ответ: Как узать объект?

Да, можно оптимизировать, просто я не думал здесь об оптимизации, выложил в удобном для восприятия виде. "имплиментируем нужные действия в наследнике класса функции - инициализировать с внешней функцией экземпляр не надо - просто создаем его и все." - а так, я кстати, делал для консоли(аля Quake) там очень много кода с отражением, вот приведу в нормальный вид и выложу.
А насчет "нафига делать" - действительно, нефига было делать , а что? напрягает?. Да и может пригодится кому...
__________________

Последний раз редактировалось dimanche13, 17.11.2008 в 12:24.
(Offline)
 
Ответить с цитированием
Старый 17.11.2008, 18:46   #20
jimon
 
Сообщений: n/a
Ответ: Как узать объект?

просто не очень люблю программы которые себя пишут во время выполнения, но это мое имхо )
 
Ответить с цитированием
Старый 21.07.2009, 04:08   #21
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,354
Написано 2,470 полезных сообщений
(для 6,850 пользователей)
Ответ: Как узать объект?

Извиняюсь за некропостинг, но именно тут тема интересующая меня.
Решил написать чтоб форум не засорять.
Как я понял, есть список (TList) всех Field`ов обьекта.
Следовательно по ним можно пробежаться циклом.
А как допустим при этом "пробеге" понять ху из ху.
Я имею в виду какой Field Int какой Float.
Чтото типа GetFieldType.
И как оно отреагирует на массив или тип в фиелде?
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
(Offline)
 
Ответить с цитированием
Старый 21.07.2009, 11:49   #22
dimanche13
Мастер
 
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений
(для 252 пользователей)
Ответ: Как узать объект?

почитай раздел Reflection в справке, очень поможет но только версия должна быть 1.30 или старше
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Randomize (21.07.2009)
Старый 21.07.2009, 13:53   #23
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,354
Написано 2,470 полезных сообщений
(для 6,850 пользователей)
Ответ: Как узать объект?

Сообщение от dimanche13 Посмотреть сообщение
почитай раздел Reflection в справке, очень поможет но только версия должна быть 1.30 или старше
Читаю как маньяк!
Мысли переполняются открытыми возможностями!
Вот это функционал. Да, вот это круто. Действительно BlitzMax с Blitz3D вобще нельзя сравнивать.
блин и где я смотрел :/
Огромнейшее спасибо.

Хммм... в итоге получается, что типы в BMAX тоже не совсем типы, но они чертовски удобны
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti

Последний раз редактировалось Randomize, 21.07.2009 в 14:00.
(Offline)
 
Ответить с цитированием
Старый 21.07.2009, 17:12   #24
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: Как узать объект?

Мда..как узнать тип...эх...

if String(a) print "This is a string!"

с типами аналогично:
if TMyType(a) print "This is a TMyType!"
__________________
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поворот объекта на объект rr333 3D-программирование 11 02.01.2010 22:39
Курсор и объект Hurrit 3D-программирование 13 13.10.2009 22:33
Объект & функция DRAG C++ 6 02.12.2007 03:18
В какой объект ткнули Данил BlitzMax 11 29.10.2007 12:47
Толкаем обЪект Horror 3D-программирование 4 31.01.2007 02:06


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com