Блог программиста

Изучаем и разрабатываем что-то новое, делимся опытом.

Класическое ООП в Lua

Язык Lua реализует прототипную модель ООП, то есть на объектах. Какже на Lua реализовать обычную модель ООП (на классах)?

Про понимание классов можно почитать здесь.

Создание класса

Класс можно реализовать на базе таблицы.

Создаём пустой класс:

Person = {}

Тело класса реализуем в виде функции (за одно она будет конструктором нашего класса) и таблицы внутри неё:

function Person:new(firstName, lastName)
	local obj = {}
	
	-- сюда вставляем атрибуты и методы класса
	
	setmetatable(obj, self); -- чтобы obj ссылался на экземпляр класса
	self.__index = self; -- чтобы указать obj где искать ненайденые индексы
	return obj
end;

Такую жесть как "чтобы obj ссылался на экземпляр класса" или "чтобы указать obj где искать ненайденые индексы" комментировать отказываюсь, если интересно - покапайте в интернете =).

Атрибуты класса будут принадлежать локальной таблице obj:

obj.firstName = firstName
obj.lastName = lastName

Методы класса - обычные функции внутри Person:new:

function obj:getInfo()
	return self.firstName .." " .. self.lastName
end

Как теперь работать с таким классом?

-- Создаем экземпляр класса
vasya = Person:new("Вася", "Пупкин")

-- Выводим имя
print(vasya.firstName)

-- Выводим имя и фамилию
print(vasya:getInfo())

В Lua, если мы обращаемся к атрибуту - ставим точку, если к методу - двоеточие.

Наследование

Породим от класса Person класс Student:

Student = {}
setmetatable(Student, {__index = Person})

Давайте проверим:

masha = Student:new("Марья", "Ивановна") print(masha:getInfo())

Инкапсуляция

Все свойства в наших классах публичные, но мы можем создавать и приватные свойства. Опишем следующее внутри класса Student:

local private = {}
private.mark = 2

function obj:getMark()
	return private.mark
end

Полиморфизм

Работает на уровне языка:

function Student:getInfo()
    return "Student " .. self.firstName .. " " .. self.lastName .. ", mark = " .. self.mark
end

Надеюсь у Вас прояснилось понимание Lua и классического ООП.


Отправить комментарий
Наши проекты
Cj - язык программирования (C++ & Javascript)
Новый язык программирования, для разработки веб, мобайл, десктоп-приложений, игр... подробнее...
Контакты
vk.com/sitev_ru
Skype: sitev.ru
E-mail: mike@sitev.ru
github.com/sitev

Рейтинг@Mail.ru

Besucherzahler
счетчик посещений