[Turn] Link original: https://www.runoob.com/lua/lua-object-oriented.html
índice
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
(Notas de Lua): Lua orientada a objetos
Acho que você gosta
Origin blog.csdn.net/baidu_41388533/article/details/108505641
Recomendado
Clasificación