Инициализация атрибутов
Часть раздела 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() из прототипа, но у каждой есть свои уникальные имя и порода, хранящиеся в таблице экземпляра. В этом и заключается преимущество сочетания прототипов с параметризованными конструкторами — общее поведение при индивидуальном состоянии.
Задание
ЛегкоДавайте создадим класс Person, который создает уникальных личностей с их собственными именами и возрастом. Вы распределите свой код по двум файлам, чтобы попрактиковаться в правильной структуре модулей.
Вы создадите:
Person.lua: Определите классPersonс конструктором, который принимает имя и возраст. Включите метод:introduce(), который позволяет каждому человеку представиться.main.lua: Подключите модуль Person и создайте экземпляр человека, используя предоставленные входные данные. Затем заставьте его представиться.
Ваш конструктор :new(name, age) должен принимать оба значения и сохранять их в новом экземпляре. Метод :introduce() должен выводить текст именно в таком формате:
Hello, my name is [name] and I am [age] years oldВы получите два входных значения:
- Имя человека
- Возраст человека
Например, если входные данные — 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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигур