Menu
Coddy logo textTech

Инициализация атрибутов

Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 9 из 70.

Конструктор :new(), который ты изучил, создаёт объекты, но каждый экземпляр начинается с одинаковыми данными. Реальным объектам нужны уникальные данные: у человека есть определённое имя, у игрока — начальный счёт. Чтобы объекты были полезными, конструктор должен принимать аргументы и присваивать их новому экземпляру.

Вот как расширить constructor, чтобы он принимал начальные значения:

local Dog = {}
Dog.__index = Dog

function Dog:new(name, breed)
    local instance = {}
    setmetatable(instance, self)
    instance.name = name
    instance.breed = breed
    return instance
end

function Dog:introduce()
    print("I am " .. self.name .. ", a " .. self.breed)
end

Теперь конструктор принимает name и breed в качестве параметров. После создания пустого instance и установки его metatable мы присваиваем эти значения непосредственно полям instance. Каждый созданный объект будет иметь собственные name и breed.

local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")

dog1:introduce()  -- Вывод: Я Rex, немецкая овчарка
dog2:introduce()  -- Вывод: Я Bella, пудель

Обе собаки используют один и тот же метод :introduce() из прототипа, но каждая имеет собственные уникальные имя и породу, сохранённые в её таблице instance. В этом и заключается сила сочетания прототипов с параметризованными constructor: общее поведение при индивидуальном состоянии.

challenge icon

Задание

Легко

Давайте создадим класс Person, который создаёт уникальных людей с их собственными именами и возрастом. Вы организуете код в двух файлах, чтобы попрактиковаться в правильной структуре module.

Вы создадите:

  • Person.lua: Define ваш класс Person с constructor, который принимает имя и возраст. Добавьте метод :introduce(), позволяющий каждому человеку представиться.
  • main.lua: Require ваш module Person и создайте instance person, используя предоставленные входные данные. Затем пусть он представится.

Ваш constructor :new(name, age) должен принимать оба значения и Store их в новом instance. Метод :introduce() должен выводить текст в точно таком формате:

Hello, my name is [name] and I am [age] years old

Вы получите два входных значения:

  1. Имя person
  2. Возраст person

Например, если входные значения — Alice и 25, Output должен быть таким:

Hello, my name is Alice and I am 25 years old

Попробуйте сами

-- Подключить модуль Person
local Person = require('Person')

-- Прочитать ввод
local name = io.read()
local age = io.read()

-- TODO: Создать новый экземпляр Person с помощью Person:new(name, age)

-- TODO: Вызвать метод introduce() на вашем экземпляре person
quiz iconПроверьте себя

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

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Lua