итак давайте начнём. что такое ООП и зачем оно нужно ООП это Объектно Ориентированное Программирование. оно предназначено для удобства для создания объектов и их обработке специальными методами.
создадим функцию конструктор которая создаёт и возвращает объект Код Objects = {} Objects.__index = Objects -- это я и сам не понимаю зачем и как это работает)
function newObject() a = {} -- новый объект a.x = 0 a.y = 0 return setmetatable(Objects, a)-- создаём объект типа Objects из таблицы а и возвращаем его end
-- мы создали объект типа Objects в котором есть 2 параметра x и y
--теперь создадим функцию для ихней обработки
function Objects:setX(value) self.x = value -- изменяем x на value end
function Objects:setY(value) self.y = value end
function Objects:showData() print("x = "..self.x) print("y = "..self.y) end
-- теперь тест
obj1 = newObject() obj1:setX(12) obj1:setY(42)
obj1:show()--> x = 12 y = 42
функции встроение в объект называются методами и не существуют в пространстве имён а только в этом объекте параметр self это ссылка на себя, например: Код
function Objects:setX(value) self.x = value end
obj1:setX(12)
-- в этом случае self это obj1 а значит сто self.x = obj1.x
теперь расскажем об операторах +, -,etc.
Код
someObject = {} someObject.__add = function(op1, op2) return op1.x + op1.x end
obj1 = {x = 12} obj2 = {x = 13}
setmetatable(someObject, obj1) setmetatable(someObject, obj2)
-- как вы знаете таблицы нельзя прибавлять но в этом случае
print(obj1 + obj2)--> 25 -- вы наверное подумали WTF?
сейчас объясню. у каждого объекта есть свой оператор (даже у чисел и строк) __add - это оператор прибавления перед именем оператора должно быть два знака подчёркивания
Код
someObject.__add = function(op1, op2) return op1.x + op1.x end
-- в этот момент мы переопределили оператор прибавления -- чтобы он возвращал сумму x координат каждого объекта -- то есть в этом случае : obj1 + obj2 = obj1.x + obj2.x
под конец первой части вот список некоторых операторов
__add (+, прибавление) __sub (-, вычитание) __multiple (*, умножение) __divide (/, деление) __concat (.., конкатенация(это операция сложения строк)) __index ([index], получение данных из таблицы по индексу)
спасибо за внимание.
|