суббота, 14 февраля 2015 г.

Реализация подобия классов и объектов в Lua

Когда в Lua требуется создаться много одинаковых объектов и одинаково управлять ими, невольно задумаешься о классах и объектах. Вот только в Lua в явном виде нет классов и ООП как такового вообще. Но, тем не менее, реализовать некоторое подобие классов можно используя таблицы и мета-таблицы.
-- Непосредственно сам класс
SomeClass = {}
-- При создании объекта класса ему можно сразу определить какой-то атрибут
function SomeClass:new(msg)
 local new_obj = {msg = msg}
 self.__index = self
 return setmetatable(new_obj, self) 
end

-- Метод foo
function SomeClass:foo(text)
 -- Можно использовать self, чтобы задать какой-то атрибут
 self.text = text
end

-- Метод print_info 
function SomeClass:print_info()
 print(self.msg, self.text)
end

test = SomeClass:new("hello")
test:foo("world")
test:print_info() -- напечатает hello world

От созданного класса можно определить новый дочерний класс.
SomeClass = {}
function SomeClass:new(msg)
 local new_obj = {msg = msg}
 self.__index = self
 return setmetatable(new_obj, self) 
end

function SomeClass:foo(text)
 self.text = text
end

function SomeClass:print_info()
 print(self.msg, self.text)
end

-- Дочерний класс
SubClass = SomeClass:new(msg)

-- Метод print_end
function SubClass:print_end()
 self:foo("world")
 self:print_info()
 print("from SubClass")
end

test = SubClass:new("hello")
test:print_end()  -- напечатает hello world
                  --            from SubClass

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

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