Учебники

Lua — объектно-ориентированный

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

  • C ++
  • Джава
  • Objective-C
  • Болтовня
  • C #
  • Рубин

Особенности ООП

  • Класс — класс — это расширяемый шаблон для создания объектов, предоставляющий начальные значения для состояния (переменные-члены) и реализации поведения.

  • Объекты — это экземпляр класса, для которого выделена отдельная память.

  • Наследование — это понятие, посредством которого переменные и функции одного класса наследуются другим классом.

  • Инкапсуляция — это процесс объединения данных и функций внутри класса. Данные могут быть доступны вне класса с помощью функций. Это также известно как абстракция данных.

Класс — класс — это расширяемый шаблон для создания объектов, предоставляющий начальные значения для состояния (переменные-члены) и реализации поведения.

Объекты — это экземпляр класса, для которого выделена отдельная память.

Наследование — это понятие, посредством которого переменные и функции одного класса наследуются другим классом.

Инкапсуляция — это процесс объединения данных и функций внутри класса. Данные могут быть доступны вне класса с помощью функций. Это также известно как абстракция данных.

ООП в Луа

Вы можете реализовать ориентацию объекта в Lua с помощью таблиц и первоклассных функций Lua. Помещая функции и связанные данные в таблицу, формируется объект. Наследование может быть реализовано с помощью метатаблиц, обеспечивающих механизм поиска несуществующих функций (методов) и полей в родительском объекте (ах).

Таблицы в Lua имеют свойства объекта, такие как состояние и идентичность, которые не зависят от его значений. Два объекта (таблицы) с одинаковым значением являются разными объектами, тогда как объект может иметь разные значения в разное время, но это всегда один и тот же объект. Как и у объектов, таблицы имеют жизненный цикл, который не зависит от того, кто их создал или где они были созданы.

Пример из реального мира

Концепция объектной ориентации широко используется, но вам необходимо четко понимать ее для правильной и максимальной выгоды.

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

Формы могут иметь общее свойство Area. Таким образом, мы можем расширить другие фигуры из формы базового объекта с помощью общей области свойств. Каждая из фигур может иметь свои собственные свойства и функции, например, прямоугольник может иметь свойства length, width, area в качестве своих свойств, а printArea и defineArea в качестве своих функций.

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

Простая реализация класса для прямоугольника с тремя свойствами: площадь, длина и ширина показаны ниже. Он также имеет функцию printArea для печати рассчитанной площади.

-- Meta class
Rectangle = {area = 0, length = 0, breadth = 0}

-- Derived class method new

function Rectangle:new (o,length,breadth)
   o = o or {}
   setmetatable(o, self)
   self.__index = self
   self.length = length or 0
   self.breadth = breadth or 0
   self.area = length*breadth;
   return o
end

-- Derived class method printArea

function Rectangle:printArea ()
   print("The area of Rectangle is ",self.area)
end

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

Создание объекта — это процесс выделения памяти для экземпляра класса. Каждый из объектов имеет свою собственную память и разделяет данные общего класса.

r = Rectangle:new(nil,10,20)

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

Мы можем получить доступ к свойствам в классе, используя оператор точки, как показано ниже —

print(r.length)

Доступ к функции-члену

Вы можете получить доступ к функции-члену, используя оператор двоеточия с объектом, как показано ниже —

r:printArea()

Память распределяется и устанавливаются начальные значения. Процесс инициализации можно сравнить с конструкторами в других объектно-ориентированных языках. Это не что иное, как функция, которая позволяет устанавливать значения, как показано выше.

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

Давайте посмотрим на полный пример, используя объектную ориентацию в Lua.

Live Demo

-- Meta class
Shape = {area = 0}

-- Base class method new

function Shape:new (o,side)
   o = o or {}
   setmetatable(o, self)
   self.__index = self
   side = side or 0
   self.area = side*side;
   return o
end

-- Base class method printArea

function Shape:printArea ()
   print("The area is ",self.area)
end

-- Creating an object
myshape = Shape:new(nil,10)

myshape:printArea()

Когда вы запустите вышеуказанную программу, вы получите следующий вывод.

The area is 	100

Наследование в Lua

Наследование — это процесс расширения простых базовых объектов, таких как фигура, на прямоугольники, квадраты и так далее. Он часто используется в реальном мире для обмена и расширения основных свойств и функций.

Давайте посмотрим на простое расширение класса. У нас есть класс, как показано ниже.

-- Meta class
Shape = {area = 0}

-- Base class method new

function Shape:new (o,side)
   o = o or {}
   setmetatable(o, self)
   self.__index = self
   side = side or 0
   self.area = side*side;
   return o
end

-- Base class method printArea

function Shape:printArea ()
   print("The area is ",self.area)
end

Мы можем расширить форму до квадратного класса, как показано ниже.

Square = Shape:new()

-- Derived class method new

function Square:new (o,side)
   o = o or Shape:new(o,side)
   setmetatable(o, self)
   self.__index = self
   return o
end

Базовые функции

Мы можем переопределить функции базового класса, то есть вместо того, чтобы использовать функцию в базовом классе, производный класс может иметь собственную реализацию, как показано ниже —

-- Derived class method printArea

function Square:printArea ()
   print("The area of square is ",self.area)
end

Пример завершения наследования

Мы можем расширить реализацию простого класса в Lua, как показано выше, с помощью другого нового метода с помощью метатаблиц. Все переменные-члены и функции базового класса сохраняются в производном классе.

Live Demo

-- Meta class
Shape = {area = 0}

-- Base class method new

function Shape:new (o,side)
   o = o or {}
   setmetatable(o, self)
   self.__index = self
   side = side or 0
   self.area = side*side;
   return o
end

-- Base class method printArea

function Shape:printArea ()
   print("The area is ",self.area)
end

-- Creating an object
myshape = Shape:new(nil,10)
myshape:printArea()

Square = Shape:new()

-- Derived class method new

function Square:new (o,side)
   o = o or Shape:new(o,side)
   setmetatable(o, self)
   self.__index = self
   return o
end

-- Derived class method printArea

function Square:printArea ()
   print("The area of square is ",self.area)
end

-- Creating an object
mysquare = Square:new(nil,10)
mysquare:printArea()

Rectangle = Shape:new()

-- Derived class method new

function Rectangle:new (o,length,breadth)
   o = o or Shape:new(o)
   setmetatable(o, self)
   self.__index = self
   self.area = length * breadth
   return o
end

-- Derived class method printArea

function Rectangle:printArea ()
    print("The area of Rectangle is ",self.area)
end

-- Creating an object

myrectangle = Rectangle:new(nil,10,20)
myrectangle:printArea()

Когда мы запустим вышеупомянутую программу, мы получим следующий вывод —

The area is 	100
The area of square is 	100
The area of Rectangle is 	200

В приведенном выше примере мы создали два производных класса — Rectangle и Square из базового класса Square. Можно переопределить функции базового класса в производном классе. В этом примере производный класс переопределяет функцию printArea.