0Pricing
Lua Academy · Урок

Композиция примесей и проверка интерфейсов

Подключайте несколько таблиц поведения и проверяйте соответствие интерфейсу.

«Композиция примесей и проверка интерфейсов» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Проектирование базового класса и конструктора
  2. Многоуровневое наследование
  3. Композиция примесей и проверка интерфейсов
  4. instanceof и изучение типов
← Назад к Lua Academy