- 33
- 41
class.lua
class.lua - Это библиотека, которая добавляет несколько ключевых слов, с помощью которых можно легко создавать классы, и отказаться от функций конструкторов.Как это работает?
В главном файле class.lua, находиться таблица, которая хранит в себе все объявленные классы, их поля, методы, и функцию - конструктор. Благодаря этому, библиотека сома понимает в каком контексте она работает сейчас, и с каким полем она работает сейчас. Это даёт возможность создать очень приятный и понятный синтаксис, будто это не библиотека, а все работает нативно.Создание класса
Для создания класса, необходимо подключить библиотеку и воспользоваться ключевым словом class. Далее нужно указать имя нужного класса, и для красоты кода можно заключить весь body класса в do end
Lua:
require("class")
class "Car" do
end
Создание элементарных полей
В этой библиотеке, вы можете использовать область видимости полей, такие как public, private, static.- Public - поле, которое будет видно всем. Поля public попадают в области видимости всех методов и в сам экземпляр класса. В методах обращения происходят через ключевое слово this.
- Private - поле, которое видят только лишь методы класса. Поля private не попадают в конечный экземпляр класса. В методах обращения происходит через ключевое слово privateThis.
- Static - поле, которое не может использовать в себе ключевые слова this и privateThis. Данное поле можно вызвать, ещё не создавая экземпляр самого класса. В нём можно хранить ключевую информацию, которая не будет никак изменяться в методах, и может быть использована в других классах.
Lua:
require("class") -- импорт class.lua
class "Car" do -- создание класса Car
public "model" undefined() -- пишем область видимости (public), затем имя переменной, и указываем что не будем указывать в неё значение при создании (функция undefined())
end
Lua:
require("class")
class "Car" do
public "model" define "BMW M3"
end
Создание экземпляра класса
Вот мы создали класс Car. Теперь нам необходимо создать его экземпляр, для работы с его полями. Сразу после объявления класса, в глобальную область видимости попадает таблица с именем самого класса. Эту таблицу можно использовать как конструктор экземпляра, и из неё же можно достать static методы
Lua:
require("class")
class "Car" do
public "model" define "BMW M3"
end
local myCar = Car()
print(myCar.model) -- BMW M3
Lua:
require("class")
class "Car" do
public "model" undefined()
constructor(function(carModel)
this.model = carModel
end)
end
local myCar = Car("BMW X4")
print(myCar.model) -- BMW X4
Создание методов
Создание метода не сильно отличается от создания поля. Для создания метода класса, нам необходимо использовать следующую конструкцию:
Lua:
require("class")
class "Car" do
public "model" undefined()
public() method "setModel" callback(function(newModel)
this.model = newModel
end)
constructor(function(carModel)
this.model = carModel
end)
end
local myCar = Car("BMW X4")
print(myCar.model) -- BMW X4
myCar.setModel("BMW i8")
print(myCar.model) -- BMW i8
Наследование
Допустим, мы хотим создать какой-нибудь другой класс, у которого будут свои поля, и какие-нибудь особые методы, но он так же должен сохранить все поля и методы другого класса. Для этого и нужно наследование. Наследование в class.lua создано следующим образом:
Lua:
require("class")
class "Car" do
public "model" undefined()
public() method "setModel" callback(function(newModel)
this.model = newModel
end)
constructor(function(carModel)
this.model = carModel
end)
end
class "BMW" extends "Car" do
constructor(function(model)
super("BMW " .. model)
end)
end
local myCar = Car("BMW X4")
print(myCar.model) -- BMW X4
myCar.setModel("BMW i8")
print(myCar.model) -- BMW i8
local bmwCar = BMW("X7")
print(bmwCar.model) -- BMW X7
Представим, что нам не нужно вызывать функцию конструктор, а нужно лишь просто изменить одно поле, в данном случае model. В этом случае, можно использовать функцию override:
Lua:
require("class")
class "Car" do
public "model" undefined()
public() method "setModel" callback(function(newModel)
this.model = newModel
end)
constructor(function(carModel)
this.model = carModel
end)
end
class "BMW" extends "Car" do
override "model" define "BMW X7" -- С помощью функции override указываем какое поле нужно перезаписать, и с помощью функции define указываем его значение
end
local myCar = Car("BMW X4")
print(myCar.model) -- BMW X4
myCar.setModel("BMW i8")
print(myCar.model) -- BMW i8
local bmwCar = BMW()
print(bmwCar.model) -- BMW X7
Тема и так получилась слишком большая, так что остальную информацию поместить не получиться. Если будут вопросы - можете задавать в тему.
Вложения
Последнее редактирование: