Menu
Coddy logo textTech

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

Часть раздела Object Oriented Programming путешествия по Lua на Coddy — урок 9 из 70.

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

Вот как расширить конструктор для приема начальных значений:

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 в качестве параметров. После создания пустого экземпляра и установки его метатаблицы, мы присваиваем эти значения непосредственно полям экземпляра. Каждый созданный объект будет иметь свои собственные name и breed.

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

dog1:introduce()  -- Вывод: Я Rex, a German Shepherd
dog2:introduce()  -- Вывод: Я Bella, a Poodle

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

challenge icon

Задание

Легко

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

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

  • Person.lua: Определите класс Person с конструктором, который принимает имя и возраст. Включите метод :introduce(), который позволяет каждому человеку представиться.
  • main.lua: Подключите модуль Person и создайте экземпляр человека, используя предоставленные входные данные. Затем заставьте его представиться.

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

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

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

  1. Имя человека
  2. Возраст человека

Например, если входные данные — Alice и 25, вывод должен быть следующим:

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

Шпаргалка

Чтобы создавать объекты с уникальными данными, расширьте конструктор :new(), чтобы он принимал параметры и присваивал их экземпляру:

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

Создайте экземпляры с разными значениями:

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

dog1:introduce()  -- Вывод: I am Rex, a German Shepherd
dog2:introduce()  -- Вывод: I am Bella, a Poodle

Каждый объект имеет свои собственные уникальные данные, хранящиеся в таблице экземпляра, при этом используя общие методы прототипа.

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

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

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

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

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

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

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