суббота, 28 апреля 2012 г.

LUA для самых маленьких vol 1

Пишу мурзилку для будущего скриптера. Буду выкладывать кусками здесь, на проветриться.
Если есть замечания - буду рад бесплатным советам. Ну, если че.

Мардонг объекта,  подход 1



object = {}
function object:say() 
   print(self.value.."i Love You!"
end
function object:create(val)
   local instance    = {}
   instance.value   = val
   setmetatable(instance,self)
   self.__index   = self
   return instance
end
-- прмер использования
foo = object:create("вася") -- конструирование
bar = object:create("таня") -- конструирование
foo:say() -- использование метода объекта
bar:say() -- использование метода объекта
function foo:addin_method()  -- добавление собственного метода в наш объект
   print (self.value.." hello from add-in method!" )
end
function foo:add_mixin()  -- Mix-In хук
  self.old_say = self.say
  self.say = function()
     print("hello from mix-in!")
     old_say()
  end
end

  1. Создаем объект object - то есть пустую таблицу с именем object 
  2. Пишем метод обекта к примеру - say() - то есть добавляем в таблицу поле-функцию say, которая использует поле-член value.
  3. Добавляем конструктор (точнее фабрику) объекта object - то есть добавляем в таблицу функцию-член create, которая инициализирует поле член value

Конструктор :
  1. Создаем локальную таблицу членов экземпляра нашего класса, содержащую члены экземпляра класса, в нашем случае это одна переменная value
  2. Инициализируем ее параметром конструктора, если нам нужен конструктор с параметром, либо значением по умолчанию
  3. Устанавливаем локальную таблицу членов экземпляра  метатаблицей нашего класса
  4.  Говорим, что при отсутствии элемента в таблице экземпляра, надо искать в таблице класса
  5. Возврашаем таблицу 'эекземпляра instance
С точки зрения ООП языков проще воспринимать все члены таблицы object., как статические члены нашего класса, а таблицы instance - как члены экземпляра класса.
Получение экземпляра: вызов конструктора возвращает таблицу экземпляра класса.
Добавление метода в класс : добавление метода в таблицу object
Добавление члена в класс : добавление члена в таблицу instance в конструкторе (точнее фабрики, конечно)
Добавление метода в экземпляр : просто добавление метода в таблицу экземпляра
MixIn : Хук существующего метода c заменой реализации метода класса своей, с сохранением и вызовом оригинального метода.

Комментариев нет:

Отправить комментарий