Lua - Введение в ООП

Введение в ООП

Здравствуйте, начинающие программисты! Сегодня мы отправимся в увлекательное путешествие в мир объектно-ориентированного программирования (ООП) с использованием Lua. Не волнуйтесь, если вы новички в программировании; я буду вести вас через каждый шаг с той же заботой и энтузиазмом, которые я использую в своих занятиях уже много лет.

Lua - Object Oriented

Объектно-ориентированное программирование похоже на строительство из LEGO кирпичиков. Каждый кирпичик (или объект) имеет свои свойства и может выполнять определенные действия. Когда мы складываем их вместе, мы создаем потрясающие структуры (или программы)!

Основные черты ООП

Прежде чем мы углубимся в Lua, давайте быстро рассмотрим основные черты ООП:

  1. Инкапсуляция: Это как хранение ваших игрушек в коробке. Коробка (объект) содержит все связанные вещи (данные и функции).
  2. Наследование: Представьте, что у вас есть игрушечный робот. Теперь у вас появился новый робот, который может делать все, что мог старый, plus новые трюки. Это наследование!
  3. Многообразие форм (полиморфизм): Это как иметь пульт дистанционного управления, который работает с разными устройствами. Одинаковая кнопка, разные действия в зависимости от того, что вы контролируете.
  4. Абстракция: Представьте это как использование микроволновой печи. Вам не нужно знать, как она работает внутри; вам нужно только знать, какие кнопки нажимать.

ООП в Lua

Теперь давайте посмотрим, как мы можем использовать эти концепции ООП в Lua. Lua не имеет встроенных классов, как некоторые другие языки, но мы можем создавать объектно-ориентированные структуры, используя таблицы и функции. Это как если бы мы строили свой собственный LEGO набор с нуля!

Создание простого класса

Давайте начнем с создания простого класса. В Lua мы используем таблицы для представления классов.

local Dog = {}
Dog.__index = Dog

function Dog.new(name, age)
local self = setmetatable({}, Dog)
self.name = name
self.age = age
return self
end

function Dog:bark()
print(self.name .. " говорит: Вовк!")
end

Давайте разберем это:

  1. Мы создаем таблицу叫做 Dog.
  2. Мы устанавливаем Dog.__index = Dog. Это немного магии Lua, которая помогает с наследованием.
  3. Мы создаем функцию new, которая действует как наш конструктор. Она создает нового пса с именем и возрастом.
  4. Мы добавляем метод bark к нашему классу Dog.

Создание объекта

Теперь, когда у нас есть наш класс Dog, давайте создадим объект Dog:

local myDog = Dog.new("Бuddy", 3)

Поздравляю! Вы только что создали свой первый объект. myDog теперь является объектом Dog с именем "Buddy" и возрастом 3.

Доступ к свойствам

Мы можем доступа к свойствам нашего пса следующим образом:

print(myDog.name) -- Выводит: Buddy
print(myDog.age)  -- Выводит: 3

Это так же просто, как использование точечной нотации!

Доступ к методу члена

Чтобы заставить нашего пса лаять, мы можем вызвать метод bark:

myDog:bark() -- Выводит: Buddy говорит: Вовк!

Обратите внимание на двоеточие : вместо точки. Это способ Lua передать self в метод.

Полный пример

Давайте соберем все вместе:

local Dog = {}
Dog.__index = Dog

function Dog.new(name, age)
local self = setmetatable({}, Dog)
self.name = name
self.age = age
return self
end

function Dog:bark()
print(self.name .. " говорит: Вовк!")
end

local Labrador = {}
setmetatable(Labrador, {__index = Dog})

function Labrador.new(name, age, color)
local self = Dog.new(name, age)
setmetatable(self, {__index = Labrador})
self.color = color
return self
end

function Labrador:swim()
print(self.name .. " плавает!")
end

Здесь мы создаем класс Labrador, который наследуется от Dog. Он имеет все свойства и методы Dog, plus новый признак (color) и новый метод (swim).

Переопределение базовых функций

Мы также можем переопределить функции из базового класса. Давайте дадим нашему Labrador особый лай:

function Labrador:bark()
print(self.name .. " говорит: Вовк вовк вовк!")
end

Теперь, когда лает Labrador, это будет отличаться от обычного Dog.

Полный пример наследования

Давайте соберем все вместе:

local Dog = {}
Dog.__index = Dog

function Dog.new(name, age)
local self = setmetatable({}, Dog)
self.name = name
self.age = age
return self
end

function Dog:bark()
print(self.name .. " говорит: Вовк!")
end

local Labrador = {}
setmetatable(Labrador, {__index = Dog})

function Labrador.new(name, age, color)
local self = Dog.new(name, age)
setmetatable(self, {__index = Labrador})
self.color = color
return self
end

function Labrador:swim()
print(self.name .. " плавает!")
end

function Labrador:bark()
print(self.name .. " говорит: Вовк вовк вовк!")
end

local myDog = Dog.new("Buddy", 3)
local myLabrador = Labrador.new("Max", 2, "Желтый")

myDog:bark()      -- Выводит: Buddy говорит: Вовк!
myLabrador:bark() -- Выводит: Max говорит: Вовк вовк вовк!
myLabrador:swim() -- Выводит: Max плавает!

И вот оно! Мы создали базовую структуру класса, реализовали наследование и даже переопределили методы. Вы на правильном пути к тому, чтобы стать экспертом в ООП в Lua!

помните, что практика makes perfect. Попробуйте создать свои собственные классы и поэкспериментируйте с разными свойствами и методами. Счастливого кодирования!

Credits: Image by storyset