![]() |
Как узать объект?
Ну есть у меня например ф-ция для триггера:
function Trigger(x:int,y:int, ob:object), которая должна изменять состояние объекта ob. как взять ссылку на этот объект, что бы изменить внутренние его поля ob.x = 1 или использовать методы ob.choose() ? Я сделал так, в самом объекте написал метод get() ,который возращает себя (return self), но это работает только если, я жестко указываю в объявлении функции тип объекта(TMyObj) function Trigger(x:int,y:int, ob:TmyObj) Возможно ли сделать как-нибудь по-другому? то есть универсальную функцию, а не набор из function TriggerObj1(x:int,y:int, ob:TmyObj1) .. function TriggerObj2(x:int,y:int, ob:TmyObj2) .. function TriggerObj3(x:int,y:int, ob:TmyObj3) .. |
Re: Как узать объект?
Сделай из нее метод, и будет тебе счасьте.
|
Re: Как узать объект?
чего???
|
Re: Как узать объект?
Ну тут не такой подход нужен. Здесь нужно методами все это промышлять.
|
Re: Как узать объект?
ну поделись своим методом...
|
Re: Как узать объект?
кури вот так
Код:
Type TmyObj |
Re: Как узать объект?
Ну если я правильно мыслю, то все по типу:
Есть тип Object Цитата:
Ну и сменять их методом: Цитата:
Так и так, придется набирать :) Сэкономить нажатие клавиш вроде не получится. |
Re: Как узать объект?
Пилять, может я что-то не так объяснил. Все что вы пишите, я и так знаю. Я говорю тип триггер , в который можно передавать любой объект вот что меня интересует.
2JohnK type object - не скомпилится ,потому что это два зарезервированных слова. |
Re: Как узать объект?
dimanche13
юзай наследие Код:
Type Trigger function myfunc(my_variable:Object) end function |
Re: Как узать объект?
В общем я понял. Я плохо объяснил, что хочу. И никто мне не поможет, кроме себя самого. Всем спасибо. Все свободны.
|
Ответ: Как узать объект?
Несмотря на давность темы - решил оживить её. Вот один вариант:
Код:
Type TA |
Ответ: Как узать объект?
Любой пользовательский обьект экземпляра - есть не что иное - как расширенный Object - их можно привести друг в друга.
Для общих случаев юзай обьекты. Здесь тип Object - выступает неким "мостиком" который хранит указатель на обьект класса. Для частного случая, когда необходимо точно узнать триггер это или например лифт, то просто приводим этот обьект в пользовательский тип, если результат не равен нулю - значит попали....=) |
Ответ: Как узать объект?
Цитата:
|
Ответ: Как узать объект?
Да, это все понятно, что вы говорите, суть проблемы была - загнать любой тип данных в функцию, и проблема до сих пор не решена. А к какому типу принадлежит объект можно и select-ом узнать.
|
Re: Ответ: Как узать объект?
Цитата:
Есть такое понятие - иерархия классов, оно подразумевает некий базовый класс (в идеале полностью абстрактный) от которого наследуются все остальные. Проблема решается 2мя способами - перегружаемыми функциями или с помощью ООП. 1. Перегружаемых функций в БМ нет. Их можно сделать ручками, что неудобно. Этот вариант ты уже написал в самом первом посте. Все это гимор и останавливаться на этом не буду. 2. ООП. Тут есть где разгуляться: 2.1. Определение типов и приведение типов - уже описывали. Могу добавить что появился класс, который играет роль своеобразного указателя на класс объекта, что криво, но лучше что-то чем ничего. Ну и вообще основное его назначение не это, а отражения (reflection). И имя ему TTypeId. И плавно переходим к 2.2. Отражения. С помощью TTypeId можно определить класс и вызвать метод или обратиться к полю по имени. А также проверить есть ли нужное поле в классе, по его имени - Method FindField:TField( name$ ). Это подойдет ну для любого класса. 2.3. Иерархия (ИМО самый правильный и переносимый способ). Наследуем все нужные для работы классы от базового, в котором прописываем нужные общие поля и методы (абстракция в БМ есть). Аргументом передаем базовый тип, с которым можно делать то, что нам нужно. Пжалуста.:cool: |
Ответ: Как узать объект?
oxid я это все знаю, спасибо. Сделал, наследованием от базового типа.
К тому же сделал класс, в котором можно добавлять типы и методы динамически во время выполнения программы. Тип содержит 2 поля список_полей и список_методов, а так же методы добавления, удаления и вызова методов и параметров. Получилось довольно забавно. :) Код:
SuperStrict |
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 ); Проверку на нуль быстрее делать, чем список проходить. Вроде все ;) ЗЫ: а простые типы тоже в объекты оборачивал :) |
Ответ: Как узать объект?
нафига делать то что делает транслятор за вас ?
|
Ответ: Как узать объект?
Да, можно оптимизировать, просто я не думал здесь об оптимизации, выложил в удобном для восприятия виде. "имплиментируем нужные действия в наследнике класса функции - инициализировать с внешней функцией экземпляр не надо - просто создаем его и все." - а так, я кстати, делал для консоли(аля Quake) там очень много кода с отражением, вот приведу в нормальный вид и выложу.
А насчет "нафига делать" - действительно, нефига было делать :) , а что? напрягает?. Да и может пригодится кому... |
Ответ: Как узать объект?
просто не очень люблю программы которые себя пишут во время выполнения, но это мое имхо )
|
Ответ: Как узать объект?
Извиняюсь за некропостинг, но именно тут тема интересующая меня.
Решил написать чтоб форум не засорять. Как я понял, есть список (TList) всех Field`ов обьекта. Следовательно по ним можно пробежаться циклом. А как допустим при этом "пробеге" понять ху из ху. Я имею в виду какой Field Int какой Float. Чтото типа GetFieldType. И как оно отреагирует на массив или тип в фиелде? |
Ответ: Как узать объект?
почитай раздел Reflection в справке, очень поможет :) но только версия должна быть 1.30 или старше
|
Ответ: Как узать объект?
Цитата:
Мысли переполняются открытыми возможностями! Вот это функционал. Да, вот это круто. Действительно BlitzMax с Blitz3D вобще нельзя сравнивать. блин и где я смотрел :/ Огромнейшее спасибо. Хммм... в итоге получается, что типы в BMAX тоже не совсем типы, но они чертовски удобны |
Ответ: Как узать объект?
Мда..как узнать тип...эх...
if String(a) print "This is a string!" с типами аналогично: if TMyType(a) print "This is a TMyType!" |
Часовой пояс GMT +4, время: 22:26. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot