Menu
Coddy logo textTech

Конструктор :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() становится единственным местом, где происходит создание объекта, что делает ваш код организованным и предсказуемым.

challenge icon

Задание

Легко

Давайте создадим класс 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() указанное количество раз
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Object Oriented Programming