Инициализация атрибутов
Часть раздела Объектно-ориентированное программирование путешествия по 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: общее поведение при индивидуальном состоянии.
Задание
ЛегкоДавайте создадим класс 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Вы получите два входных значения:
- Имя person
- Возраст 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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигурПотренируйтесь самостоятельно: Онлайн-компилятор Lua