Конструктор :new()
Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 8 из 70.
Создание объектов вручную, создание пустой таблицы, установка её метатаблицы и связывание __index становятся рутинными. Стандартное решение — определить метод-конструктор :new() непосредственно в class, который выполнит всё это за вас.
Вот шаблон:
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, instance может найти все методы, определённые в Dog. Наконец, мы возвращаем новый объект.
Обратите внимание на строку Dog.__index = Dog вне конструктора. Это распространённое сокращение: вместо создания отдельной метатаблицы таблица класса используется и как прототип, и как метатаблица.
Теперь создание объектов выполняется чисто и единообразно:
local myDog = Dog:new()
myDog:bark() -- Вывод: Woof!Каждый class, который вы создаёте, будет следовать этой же структуре. Конструктор :new() становится единственным местом, где происходит создание объектов, благодаря чему ваш код остаётся организованным и предсказуемым.
Задание
ЛегкоДавайте создадим class Cat, используя стандартный шаблон конструктора, который вы только что изучили. Вы распределите код по двум файлам, чтобы попрактиковаться в правильной структуре module.
Вы создадите:
Cat.lua: Define вашCatclass с полным шаблоном конструктора. Ваш class должен включать:- таблицу class с
__index, указывающим на неё саму - конструктор
:new(), который создаёт instance, устанавливает его metatable и возвращает его - method
:meow(), который выводит звук cat
- таблицу class с
main.lua: Require ваш модуль Cat и используйте конструктор, чтобы создать instance cat. Затем вызовите его method, чтобы проверить, что всё правильно связано.
Вы получите один input: number раз, которое ваш cat should мяукнуть.
Ваш method :meow() должен выводить exactly:
Meow!В вашем основном файле создайте cat с помощью Cat:new() и вызовите :meow() указанное количество times.
Например, если input равен 3, Output должен быть таким:
Meow!
Meow!
Meow!Попробуйте сами
-- Подключить модуль Cat
local Cat = require('Cat')
-- Прочитать ввод: количество раз мяуканья
local times = tonumber(io.read())
-- TODO: Создать экземпляр кота с помощью Cat:new()
-- TODO: Вызвать метод :meow() указанное количество раз
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигурПотренируйтесь самостоятельно: Онлайн-компилятор Lua