Наследование методов
Часть раздела Объектно-ориентированное программирование путешествия по Lua на Coddy. Урок 32 из 70.
После установления связи inheritance экземпляры дочернего класса автоматически получают доступ ко всем методам родительского класса. Это происходит благодаря цепочке поиска Lua: когда вы вызываете method у instance, Lua выполняет поиск в каждой связанной таблице, пока не найдёт то, что вы ищете.
Рассмотрим эту настройку, где Animal определяет метод :breathe():
local Animal = {}
Animal.__index = Animal
function Animal:new()
local obj = {}
setmetatable(obj, Animal)
return obj
end
function Animal:breathe()
print("Breathing...")
end
-- Dog наследует от Animal
local Dog = {}
Dog.__index = Dog
setmetatable(Dog, {__index = Animal})
function Dog:new()
local obj = {}
setmetatable(obj, Dog)
return obj
endТеперь посмотри, что произойдёт, когда мы создадим Dog и вызовем method родителя:
local buddy = Dog:new()
buddy:breathe() -- Вывод: Breathing...Класс Dog никогда не определял :breathe(), однако он работает. Сначала Lua проверяет buddy и ничего не находит, затем проверяет Dog — снова ничего, и наконец находит его в Animal. Это автоматическое наследование методов означает, что ты один раз записываешь общее поведение в родительском классе, и каждый дочерний класс сразу получает от него преимущества.
Задание
ЛегкоДавайте создадим простую иерархию существ, чтобы увидеть inheritance methods в действии! Вы создадите родительский Animal class и дочерний Dog class, а затем продемонстрируете, что экземпляры Dog могут использовать methods, определённые только в Animal.
Вы организуете код в трёх файлах:
Animal.lua: Define ваш Parent class с использованием стандартного шаблона class. Добавьте constructor:new(name), который сохраняет имя животного, и method:speak(), который выводит имя животного, за которым следуетmakes a sound. В конце файла верните class.Dog.lua: Define ваш дочерний class, который inherits от Animal. Подключите модуль Animal и настройте inheritance link, чтобы Dog мог получать доступ к methods Animal. Добавьте constructor:new(name), который сохраняет имя и устанавливает Dog как metatable. Class Dog НЕ должен определять собственный method:speak(). Он унаследует его от Animal.main.lua: Подключите модуль Dog, прочитайте имя из input, создайте экземпляр Dog с этим именем и вызовите на нём method:speak().
Вы получите один input: имя собаки.
Например, если input — Buddy, Output должен быть таким:
Buddy makes a soundСуть здесь в том, что ваш class Dog никогда не определяет :speak(), однако его вызов для экземпляра Dog прекрасно работает. Lua следует по цепочке поиска от экземпляра Dog к class Dog, а затем к class Animal, где находит method. Вот inheritance в действии!
Попробуйте сами
-- main.lua: Точка входа
local Dog = require('Dog')
-- Прочитать имя собаки из ввода
local name = io.read()
-- TODO: Создать экземпляр Dog с заданным именем
-- TODO: Вызвать метод :speak() у экземпляра dog
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Концепция 'self'
Таблицы с функциямиЯвный 'self'Синтаксис с двоеточиемТочка против двоеточияИтоги — Движущаяся точка4Проект: Цифровой банк
Настройка проектаМетод пополнения7Полиморфизм и переопределение
Переопределение методовВызов родительских методовУтиная типизацияОбщий интерфейсПроверка типаИтоги — Роли сотрудников2Паттерн прототипа класса
Концепция прототипаСвязывание через __indexКонструктор :new()Инициализация атрибутовНезависимые экземплярыИтоги — Автозавод5Перегрузка операторов в ООП
Сложение объектовВычитание объектовКонкатенация объектовСравнение объектов (<, >)Повторение — Математика кошелька8Инкапсуляция
Соглашения об именованииЗамыкания для приватностиДоступ через замыканияТаблицы только для чтенияЛогика валидацииИтоги — Защищенное хранилище11Паттерны проектирования (Lite)
Фабричные функцииТаблица SingletonПаттерн IteratorObserver (Слушатель)Итоги — Logger Factory3Состояние и поведение объектов
Переменные экземпляраГеттерыСеттерыВычисляемые свойстваФорматирование строкПроверка на равенствоПовторение — Оценка студента6Основы наследования
Настройка наследованияНаследование методовРасширение конструктораДобавление дочерних методовОбщее и уникальноеИтоги: Иерархия фигурПотренируйтесь самостоятельно: Онлайн-компилятор Lua