Guest untomas Posted June 15, 2010 Share Posted June 15, 2010 Пишу аддон - и столкнулся с проблемой при работе с классами, очень хочется разобраться с этим код аддона Code: Global("tmp", 0) Global("param1", "param1") Global("param2", "param2") Global("param3", "param3") Global("obj1", "obj1") Global("obj2", "obj2") --!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! КЛАССЫ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --------------------------------------Класс "data"------------------------------------------------------------------ Global("data" , { ["List"] = {} }) function data:Initialize() common.LogInfo(common.GetAddonName(),"Создаем ",obj1) self:AddNewObject(obj1) common.LogInfo(common.GetAddonName(),"Создаем ",obj2) self:AddNewObject(obj2) -- добавляем к каждому обьекту параметры "param2" common.LogInfo(common.GetAddonName(),"добавляем к ",obj1, " параметр ", param2) data.List [obj1] :AddNewParam(param2) common.LogInfo(common.GetAddonName(),"добавляем к ",obj2, " параметр ", param2) data.List [obj2] :AddNewParam(param2) -- выводим в mods.txt список обьектов и их параметров for k1,v1 in data.List do common.LogInfo(common.GetAddonName(),k1) for k2,v2 in v1.ParamsList do common.LogInfo(common.GetAddonName()," ",k2," ",common.FormatInt(v2.data,"%i")) end end --меняем у первого обьекта значение первого параметра common.LogInfo(common.GetAddonName(),"изменяем ",param1," у ",obj1, " на 10") data.List [obj1] .ParamsList [param1] .data = 10 common.LogInfo(common.GetAddonName(),"добавляем ",param3," к ",obj1) data.List [obj1] :AddNewParam(param3) -- выводим в mods.txt список обьектов и их параметров for k1,v1 in data.List do common.LogInfo(common.GetAddonName(),k1) for k2,v2 in v1.ParamsList do common.LogInfo(common.GetAddonName()," ",k2," ",common.FormatInt(v2.data,"%i")) end end end function data:AddNewObject(name) local NewObject = {} setmetatable( NewObject, {__index = ObjectData}) common.LogInfo(common.GetAddonName()," инициализируем ",name) NewObject:Initialize(name) self.List [name] = NewObject end --------------------------------------конец класса "data"----------------------------------------------------------- --------------------------------------Класс "ObjectData"------------------------------------------------------------------ Global("ObjectData" , { ["ParamsList"] = {} }) function ObjectData:Initialize(name) -- при инициализации обьекта к нему сразу добавляется параметр "param1" common.LogInfo(common.GetAddonName()," добавляем параметр ",param1) self:AddNewParam(param1) end function ObjectData:AddNewParam(name) local NewParam = {} setmetatable( NewParam, {__index = Params}) common.LogInfo(common.GetAddonName()," инициализируем параметр ",name) NewParam:Initialize(name) self.ParamsList [name] = NewParam end --------------------------------------конец класса "ObjectData"----------------------------------------------------------- --------------------------------------Класс "Params"------------------------------------------------------------------ Global("Params" , { ["data"] = 0 }) function Params:Initialize(name) tmp = tmp + 1 common.LogInfo(common.GetAddonName()," было ",common.FormatInt(self.data,"%i")) self.data = tmp common.LogInfo(common.GetAddonName()," стало ",common.FormatInt(self.data,"%i")) end --------------------------------------конец класса "Params"----------------------------------------------------------- --!!!!!!!!!!!!!!!!!!!!!!!!!!конец раздела "КЛАССЫ" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ФУНКЦИИ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! function Init() common.LogInfo(common.GetAddonName(),"аддон включен") data:Initialize() end --!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! конец раздела "ФУНКЦИИ" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Init() информация из mods.txt Code: Info: addon test: аддон включен Info: addon test: Создаем obj1 Info: addon test: инициализируем obj1 Info: addon test: добавляем параметр param1 Info: addon test: инициализируем параметр param1 Info: addon test: было 0 Info: addon test: стало 1 Info: addon test: Создаем obj2 Info: addon test: инициализируем obj2 Info: addon test: добавляем параметр param1 Info: addon test: инициализируем параметр param1 Info: addon test: было 0 Info: addon test: стало 2 Info: addon test: добавляем к obj1 параметр param2 Info: addon test: инициализируем параметр param2 Info: addon test: было 0 Info: addon test: стало 3 Info: addon test: добавляем к obj2 параметр param2 Info: addon test: инициализируем параметр param2 Info: addon test: было 0 Info: addon test: стало 4 Info: addon test: obj2 Info: addon test: param2 4 Info: addon test: param1 2 Info: addon test: obj1 Info: addon test: param2 4 Info: addon test: param1 2 Info: addon test: изменяем param1 у obj1 на 10 Info: addon test: добавляем param3 к obj1 Info: addon test: инициализируем параметр param3 Info: addon test: было 0 Info: addon test: стало 5 Info: addon test: obj2 Info: addon test: param2 4 Info: addon test: param1 10 Info: addon test: param3 5 Info: addon test: obj1 Info: addon test: param2 4 Info: addon test: param1 10 Info: addon test: param3 5 т.е. изменяем параметр param1 только у первого обьекта - он изменяется у обоих при добавлении нового параметра к обьекту obj1 - он появляется у обоих обьектов. Quote Link to comment Share on other sites More sharing options...
SLA Posted June 20, 2010 Share Posted June 20, 2010 Очень грамотно составленный запрос о помощи. Странно, что никто до сих пор не отозвался, аж стыдно за коллег Лично я ещё не сделал ни одного аддона, в котором бы активно использовались классы. Поэтому я ещё не разбирался, как классы работают в LUA, и конкретно в Аллодах. И не стесняюсь признаться в этом То есть, мне, по существу, посоветовать нечего Я только подозреваю, что в вышеприведённом коде, ты создаёшь НЕ новые объекты, а просто линкуешь один и тот же объект в нескольких местах. Поэтому, когда он изменяется, он изменяется везде. Конечно, я могу ошибаться, т.к. нихрена не смыслю в этом. Но я могу посоветовать посмотреть, как устроена библиотека классов AOClassLibrary.lua, которую можно найти в аддоне DarkDPSMeter. Там всё отлично работает, думаю, ты найдёшь подходящее решение там Quote Link to comment Share on other sites More sharing options...
Guest untomas Posted June 20, 2010 Share Posted June 20, 2010 да, мысль о том что создаются линки на один экземпляр мне тоже приходила в голову, но я никак не могу разобраться почему это происходит =) ну а AOClassLibrary.lua я просто как настольную книгу использую =D эх... буду дальше ковырять..ну и ждать, может ктонить разжует =\ Quote Link to comment Share on other sites More sharing options...
Guest untomas Posted June 24, 2010 Share Posted June 24, 2010 нда... я сдаюсь =\ Quote Link to comment Share on other sites More sharing options...
SLA Posted June 29, 2010 Share Posted June 29, 2010 Зря В Аллодах используется обычный Lua 5.0. Поэтому, обучиться работе с классами поможет любой учебник по Lua. Quote Link to comment Share on other sites More sharing options...
Recommended Posts