Композиция примесей и проверка интерфейсов
Подключайте несколько таблиц поведения и проверяйте соответствие интерфейсу.
«Композиция примесей и проверка интерфейсов» — бесплатный урок Lua Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Что такое миксины
Миксины — это таблицы методов, копируемых в класс. Они добавляют поведение без необходимости устанавливать связь наследования — идеально подходят для сквозных задач.
Простое применение миксина
Скопируйте методы из таблицы миксина в целевой класс.
local Serializable = {
serialize = function(self)
local parts = {}
for k, v in pairs(self) do
parts[#parts+1] = k .. "=" .. tostring(v)
end
return "{" .. table.concat(parts, ", ") .. "}"
end
}
local function mixin(cls, ...)
for _, m in ipairs({...}) do
for k, v in pairs(m) do
if cls[k] == nil then cls[k] = v end
end
end
end
mixin(Animal, Serializable)
print(cat:serialize())Перезапись и отсутствие перезаписи
Определите, должны ли примеси переопределять существующие методы. В приведённом выше примере используется if cls[k] == nil, чтобы предотвратить переопределение. Удалите эту проверку, чтобы разрешить переопределение.
Несколько примесей
Примените несколько примесей к одному классу, чтобы объединить поведение из разных источников.
local Printable = { print = function(self) print(tostring(self)) end }
local Comparable = { eq = function(self, other) return self.id == other.id end }
mixin(User, Serializable, Printable, Comparable)Определение интерфейса
Интерфейс представляет собой таблицу со списком обязательных имён методов. Используйте его, чтобы задокументировать контракт, которому должен соответствовать класс.
local IAnimal = {
"speak",
"move",
"eat",
}Функция проверки интерфейса
Проверьте, что класс реализует все методы интерфейса.
local function implements(cls, interface)
for _, method in ipairs(interface) do
if type(cls[method]) ~= "function" then
return false, "Missing method: " .. method
end
end
return true
end
local ok, err = implements(Dog, IAnimal)
print(ok, err)Строгая проверка интерфейса
Вызовите implements во время определения класса (или загрузки модуля), чтобы заранее обнаружить отсутствующие методы.
assert(implements(Dog, IAnimal))Утиная типизация и проверки интерфейсов
В Lua естественно используется утиная типизация: если у объекта есть нужный метод, его можно использовать. Явные проверки интерфейсов повышают безопасность в больших командах и общедоступных API.
Примесь с состоянием
Как правило, примеси должны быть без состояния и содержать только методы. Примеси с состоянием могут вызывать конфликты, если несколько примесей используют одинаковые имена полей.
Упорядоченное применение примесей
Если две примеси определяют один и тот же метод, побеждает применённая последней. Намеренно управляйте порядком, чтобы поведение оставалось предсказуемым.
Выбор между примесью и наследованием
Используйте наследование для сильных отношений «является». Используйте примеси для повторно используемого сквозного поведения (ведения журнала, сериализации, проверки равенства).
Вопрос о примесях
Какое ключевое преимущество примесей перед наследованием?
Повторение: примеси и интерфейсы
Примеси копируют методы в классы, добавляя сквозное поведение. Интерфейсы документируют обязательные методы и могут проверяться во время загрузки. Вместе они обеспечивают гибкую композицию, выходящую за рамки одиночного наследования.
Часто задаваемые вопросы
Урок «Композиция примесей и проверка интерфейсов» бесплатный?
Да — полный текст урока «Композиция примесей и проверка интерфейсов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Композиция примесей и проверка интерфейсов»?
Подключайте несколько таблиц поведения и проверяйте соответствие интерфейсу. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Композиция примесей и проверка интерфейсов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Проектирование базового класса и конструктора
- Многоуровневое наследование
- Композиция примесей и проверка интерфейсов
- instanceof и изучение типов