(Notas de Lua): Lua orientada a objetos

[Turn] Link original: https://www.runoob.com/lua/lua-object-oriented.html

índice

Lua orientada a objetos

Caso Típico

Criar objeto

Atributos de acesso

Acessar funções de membro

Exemplo completo

Herança de Lua

Exemplo completo

Reescrita de função


Lua orientada a objetos

  • Os objetos são compostos por propriedades e métodos .
    • A estrutura mais básica em Lua é a tabela, portanto, a tabela é necessária para descrever as propriedades dos objetos .
    • A função em lua pode ser usada para representar métodos.
    • As classes em Lua podem ser simuladas por tabela + função .
  • Já a herança pode ser simulada por metatabela (não recomendado, apenas os objetos mais básicos bastam na maior parte do tempo).
  • Uma mesa em Lua não é apenas um objeto em certo sentido.
    • Assim como os objetos, as tabelas também têm estado (variáveis ​​de membro)
    • Também tem a natureza de ser independente do valor do objeto, especialmente um objeto com dois valores diferentes (tabela) representa dois objetos diferentes
    • Um objeto pode ter valores diferentes em momentos diferentes, mas é sempre um objeto
    • Semelhante aos objetos, o ciclo de vida de uma tabela não tem nada a ver com o que ou onde foi criada.
  • Os objetos têm suas funções-membro e as tabelas também têm:
Account = {balance = 0}
function Account.withdraw (v)
    Account.balance = Account.balance - v
end
  • Essa definição cria uma nova função e a salva no campo de saque do objeto Conta, que pode ser chamado da seguinte maneira:
Account.withdraw(100.00)

Caso Típico

  • A seguinte classe simples contém três atributos: área, comprimento e largura. O método printArea é usado para imprimir os resultados do cálculo:
-- 元类
Rectangle = {area = 0, length = 0, breadth = 0}

-- 派生类的方法 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

-- 派生类的方法 printArea
function Rectangle:printArea ()
  print("矩形面积为 ",self.area)
end

Criar objeto

  • Criar um objeto é o processo de alocar memória para uma instância de uma classe . Cada classe tem sua própria memória e compartilha dados comuns.
r = Rectangle:new(nil,10,20)

Atributos de acesso

  • Você pode usar o ponto (.) Para acessar as propriedades da classe:
print(r.length)

Acessar funções de membro

  • Você pode usar os dois pontos: para acessar as funções de membro da classe:
r:printArea()
  • A memória é alocada quando o objeto é inicializado .

Exemplo completo

  • O seguinte demonstra um exemplo completo de Lua orientada a objetos:
-- 元类
Shape = {area = 0}

-- 基础类方法 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

-- 基础类方法 printArea
function Shape:printArea ()
  print("面积为 ",self.area)
end

-- 创建对象
myshape = Shape:new(nil,10)

myshape:printArea()

输出:面积为     100

Herança de Lua

  • Herança significa que um objeto usa diretamente as propriedades e métodos de outro objeto . Pode ser usado para estender as propriedades e métodos da classe base.
  • O seguinte demonstra um exemplo de herança simples:
-- Meta class
Shape = {area = 0}
-- 基础类方法 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
-- 基础类方法 printArea
function Shape:printArea ()
  print("面积为 ",self.area)
end
  • No exemplo a seguir, o objeto Square herda a classe Shape:
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

Exemplo completo

  • O exemplo a seguir herda uma classe simples para estender os métodos da classe derivada. A classe derivada retém as variáveis ​​de membro e métodos da classe herdada:
-- Meta class
Shape = {area = 0}
-- 基础类方法 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
-- 基础类方法 printArea
function Shape:printArea ()
  print("面积为 ",self.area)
end

-- 创建对象
myshape = Shape:new(nil,10)
myshape:printArea()

Square = Shape:new()
-- 派生类方法 new
function Square:new (o,side)
  o = o or Shape:new(o,side)
  setmetatable(o, self)
  self.__index = self
  return o
end

-- 派生类方法 printArea
function Square:printArea ()
  print("正方形面积为 ",self.area)
end

-- 创建对象
mysquare = Square:new(nil,10)
mysquare:printArea()

Rectangle = Shape:new()
-- 派生类方法 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

-- 派生类方法 printArea
function Rectangle:printArea ()
  print("矩形面积为 ",self.area)
end

-- 创建对象
myrectangle = Rectangle:new(nil,10,20)
myrectangle:printArea()

输出:
面积为     100
正方形面积为     100
矩形面积为     200

Reescrita de função

  • Em Lua, você pode reescrever as funções da classe base e definir sua própria implementação na classe derivada :
-- 派生类方法 printArea
function Square:printArea ()
  print("正方形面积 ",self.area)
end

 

Acho que você gosta

Origin blog.csdn.net/baidu_41388533/article/details/108505641
Recomendado
Clasificación