Конструктор :new()
Часть раздела Object Oriented Programming путешествия по Lua на Coddy — урок 8 из 70.
Создание объектов вручную — создание пустой таблицы, установка её метатаблицы, привязка __index — становится рутинным процессом. Стандартное решение заключается в определении метода-конструктора :new() непосредственно в классе, который берет всё это на себя.
Вот этот паттерн:
local Dog = {}
Dog.__index = Dog
function Dog:new()
local instance = {}
setmetatable(instance, self)
return instance
end
function Dog:bark()
print("Woof!")
endДавайте разберем, что происходит внутри :new(). Сначала мы создаем пустую таблицу с именем instance. Затем мы устанавливаем ее метатаблицу в self — которая является Dog при вызове Dog:new().
Поскольку Dog.__index указывает на саму таблицу Dog, экземпляр может найти все методы, определенные в Dog. Наконец, мы возвращаем новый объект.
Обратите внимание на строку Dog.__index = Dog вне конструктора. Это распространенный прием — вместо создания отдельной метатаблицы, таблица класса служит одновременно и прототипом, и метатаблицей.
Теперь создание объектов стало чистым и единообразным:
local myDog = Dog:new()
myDog:bark() -- Вывод: Woof!Каждый создаваемый вами класс будет следовать этой же структуре. Конструктор :new() становится единственным местом, где происходит создание объекта, что делает ваш код организованным и предсказуемым.
Задание
ЛегкоДавайте создадим класс Cat, используя стандартный паттерн конструктора, который вы только что изучили. Вы организуете свой код в двух файлах, чтобы попрактиковаться в правильной структуре модулей.
Вам предстоит создать:
Cat.lua: Определите классCatс полным паттерном конструктора. Ваш класс должен включать:- Таблицу класса с
__index, указывающим на саму себя - Конструктор
:new(), который создает экземпляр, устанавливает его метатаблицу и возвращает его - Метод
:meow(), который выводит звук кошки
- Таблицу класса с
main.lua: Подключите модуль Cat и используйте конструктор для создания экземпляра кошки. Затем вызовите его метод, чтобы убедиться, что все связано правильно.
Вы получите на вход одно значение: количество раз, которое ваша кошка должна мяукнуть.
Ваш метод :meow() должен выводить ровно:
Meow!В основном файле создайте кошку с помощью Cat:new() и вызовите :meow() указанное количество раз.
Например, если на вход подано 3, вывод должен быть следующим:
Meow!
Meow!
Meow!Шпаргалка
Чтобы создать класс с конструктором в Lua, определите метод :new(), который создает экземпляры:
local ClassName = {}
ClassName.__index = ClassName
function ClassName:new()
local instance = {}
setmetatable(instance, self)
return instance
end
function ClassName:method()
-- реализация метода
endПоле __index указывает на сам класс, позволяя экземплярам получать доступ к методам, определенным в таблице класса.
Внутри :new():
- Создайте пустую таблицу для экземпляра
- Установите её метатаблицу на
self(класс) - Верните новый экземпляр
Создавайте объекты с помощью конструктора:
local obj = ClassName:new()
obj:method()Попробуйте сами
-- Подключить модуль Cat
local Cat = require('Cat')
-- Прочитать ввод: количество раз, которое нужно мяукнуть
local times = tonumber(io.read())
-- TODO: Создать экземпляр кота, используя Cat:new()
-- TODO: Вызвать метод :meow() указанное количество раз
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигур