Всем привет! Часто слышу на этом сайте неграмотные "выкрики" в сторону LUA: "не берите луу, у луы нет ООП!", "в луе нет классов, поэтому нет и ООП", "си-шарп мощнее o_O" Обычно фанатики таких языков программирования как С++ или С# и слышать не хотят, что можно реализовать оОП (не знаю чем заменить это слово, чтобы не повторяться, поэтому буду чередовать регистром XD) иным способом, отличным от общепринятого... Давайте разберемся, что же все-таки делает этот ООп.... С чем его курят едят?
Во-первых, оОп нужен, чтобы из кучки данных сделать объект и впоследствии манипулировать уже этим объектом: надеюсь с синтаксисом ЛУА вы уже знакомы...
Код
--создадим "класс" автомобиль class_car = {} --инициализируем поля класса function class_car:new(model, color) local object = {} object.model = model or "UAZ" -- по умолчанию это будет УАЗ object.color = color or "ponos" -- поносового цвета --далее идет превращение таблицы в "класс", объяснять не буду, т.к для этого нужна отдельная статья setmetatable(object,self) self.__index = self --перед index стоит двойное подчеркивание! return object -- возвращаем объект! end
--создадим первый автомобиль! my_auto = class_car:new("BMW",nil) --получим BMW поносового цвета XD
Добавим два метода, чтобы можно было изменять модель и цвет автомобиля после его создания.
Код
--функция изменения function class_car:set(model, color) self.model = model self.color = color end
--функция получения результата function class_car:get() return self.model, self.color end
-- проверим! my_auto = class_car:new("BMW",nil) -- меняем себе машину )) my_auto:set("AUDI", "BLACK") -- проверяем print(my_auto:get()) -- получим AUDI BLACK
Во-вторых, ООП позволяет экономично использовать память с помошью наследования создадим новый класс moto и будем наследоваться от class_car
Код
class_moto = {} --пусть у него будет один свой метод function class_moto:ololo() print("trololo") end --наследуемся setmetatable(class_moto,{__index = class_car})
--проверяем my_moto = class_moto:new() --создали мото порожденный от класса class_car
--меняем название и цвет my_moto:set("URAL","BLUE") print(my_moto:get()) -->мы увидим URAL BLUE
В третьих, ооп сокращает код... Мы можем переназначать методы при наследовании, т.е один и тот же метод будет действовать по разному на родителя и потомка, а это уже полиморфизм! Например нам нужно, чтобы метод get() возвращал какие-либо другие данные, а не модель и цвет:
Код
-- давайте переназначим метод get() для класса-потомка class_moto -- после "инициализации класса" class_moto = {}, создадим такой же метод function class_moto:get() return "2000", "year" end --наследуемся setmetatable(class_moto,{__index = class_car})
--проверим my_moto = class_moto:new() --создали мото порожденный от класса class_car
--меняем название и цвет my_moto:set("URAL","BLUE") print(my_moto:get()) -->мы увидим 2000 year --вот он какой полиморфизм -- Но что делать если нужно вызвать метод get() родителя? И для этого есть решение! print(class_car.get(my_moto)) --> URAL BLUE
Ну и полный код для заядлых "копипастеров"
Код
--создадим "класс" автомобиль class_car = {} --инициализируем поля класса function class_car:new(model, color) local object = {} object.model = model or "UAZ" -- по умолчанию это будет УАЗ object.color = color or "ponos" -- поносового цвета --далее идет превращение таблицы в "класс", объяснять не буду, т.к для этого нужна отдельная статья setmetatable(object,self) self.__index = self --перед index стоит двойное подчеркивание! return object -- возвращаем объект! end
--создадим первый автомобиль! my_auto = class_car:new("BMW",nil) --получим BMW поносового цвета XD
--функция изменения function class_car:set(model, color) self.model = model self.color = color end
--функция получения результата function class_car:get() return self.model, self.color end
-- меняем себе машину )) my_auto:set("AUDI", "BLACK") -- проверяем print(my_auto:get()) -- получим AUDI
class_moto = {} -- инициализируем класс мото --пусть у него будет один свой метод function class_moto:ololo() print("trololo") end --переназначение метода function class_moto:get() return "2000", "year" end --наследуемся setmetatable(class_moto,{__index = class_car})
my_moto = class_moto:new() --создали мото порожденный от класса class_car
--меняем название и цвет my_moto:set("URAL","BLUE") print(my_moto:get()) -->мы увидим 2000 year print(class_car.get(my_moto)) --> URAL BLUE
Спасибо за внимание! Надеюсь кому-нибудь это поможет.
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «Объектно Ориентированное Программирование в LUA», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.