English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
La programación orientada a objetos (Object Oriented Programming, OOP) es una arquitectura de programación informática muy popular.
Los siguientes lenguajes de programación todos admiten la programación orientada a objetos:
C++
Java
Objective-C
Smalltalk
C#
Ruby
1)Encapsulación: Se refiere a la característica de poder colocar la información, las funciones y las respuestas de un ente en un solo objeto.
2)Herencia: El método de herencia permite expandir el programa sin modificarlo, lo que asegura que las funciones originales se conserven y se pueda expandir nuevas funciones. Esto es beneficioso para reducir la repetición de código y aumentar la eficiencia del desarrollo de software.
3)Polimorfismo: La misma operación actúa sobre diferentes objetos, puede tener diferentes interpretaciones y producir diferentes resultados de ejecución. En tiempo de ejecución, se puede llamar a métodos de la clase derivada a través de un puntero apuntando a la clase base.
4)Abstracción: La abstracción es una vía para simplificar problemas complejos de la realidad, que puede encontrar la definición de clase más adecuada para problemas específicos y explicar problemas en el nivel de herencia más adecuado.
Sabemos que los objetos están compuestos por atributos y métodos. La estructura más básica en LUA es la tabla, por lo que se necesita una tabla para describir los atributos del objeto.
Las funciones en Lua se pueden usar para representar métodos. Por lo tanto, las clases en LUA se pueden representar a través de tablas + function simular.
En cuanto a la herencia, se puede simular a través de metatable (no se recomienda, ya que solo es suficiente para simular los objetos más básicos en la mayoría de los casos).
Las tablas en Lua no solo son un tipo de objeto en algún sentido. Al igual que los objetos, las tablas tienen un estado (variables de miembros); también tienen una naturaleza independiente de los valores del objeto, especialmente cuando dos tablas con valores diferentes representan dos objetos diferentes; un objeto puede tener diferentes valores en diferentes momentos, pero siempre es un objeto; al igual que los objetos, el ciclo de vida de las tablas no tiene relación con lo que las creó o dónde se crearon. Los objetos tienen sus funciones miembro, y las tablas también tienen:
Account = {saldo = 0} function Account:withdraw (v) Account.saldo = Account.saldo - v end
Esta definición crea una nueva función y se almacena en el dominio withdraw del objeto Account, a continuación, podemos llamarlo de la siguiente manera:
Account.withdraw (100.00)
A continuación, se muestra una clase simple que contiene tres propiedades: area, longitud y anchura, el método printArea se utiliza para imprimir el resultado de la calculación:
-- clase meta Rectangle = {area = 0, longitud = 0, anchura = 0} -- método new de la clase derivada function Rectangle:new (o, longitud, ancho) o = o or {} setmetatable (o, self) self.__index = self self.longitud = longitud or 0 self.anchura = anchura or 0 self.area = longitud*anchura; return o end -- método printArea de la clase derivada function Rectangle:printArea () print("Área del rectángulo", self.area) end
La creación de un objeto es el proceso de asignar memoria para el ejemplo de la clase. Cada clase tiene su propia memoria y comparte datos comunes.
r = Rectangle:new(nil,10,20)
Podemos usar un punto (.) para acceder a las propiedades de la clase:
print(r.longitud)
Podemos usar dos puntos : para acceder a las funciones miembro de la clase:
r:printArea ()
La memoria se asigna en el momento de la inicialización del objeto.
A continuación, se muestra un ejemplo completo de programación orientada a objetos en Lua:
-- clase meta Shape = {area = 0} -- clase base método new function Shape:new (o, lado) o = o or {} setmetatable (o, self) self.__index = self lado = lado or 0 self.area = lado*lado; return o end -- clase base método printArea function Shape:printArea () print("Área", self.area) end -- Crear objeto myshape = Shape:new (nil,10) myshape:printArea ()
Ejecutar el programa anterior, el resultado de salida es:
Área 100
La herencia es la capacidad de un objeto para utilizar las propiedades y métodos de otro objeto. Se puede usar para expandir las propiedades y métodos de la clase base.
A continuación, se muestra un ejemplo simple de herencia:
-- clase meta Shape = {area = 0} -- clase base método new function Shape:new (o, lado) o = o or {} setmetatable (o, self) self.__index = self lado = lado or 0 self.area = lado*lado; return o end -- clase base método printArea function Shape:printArea () print("Área", self.area) end
A continuación, se muestra un ejemplo en el que el objeto Square hereda la clase Shape:
Square = Shape:new () -- método de clase derivada new function Square:new (o, lado) o = o o Shape:new (o, lado) setmetatable (o, self) self.__index = self return o end
A continuación, se muestra un ejemplo en el que se hereda una clase simple para extender el método de la clase derivada, la clase derivada mantiene los miembros de la clase heredada variables y métodos:
-- clase meta Shape = {area = 0} -- clase base método new function Shape:new (o, lado) o = o or {} setmetatable (o, self) self.__index = self lado = lado or 0 self.area = lado*lado; return o end -- clase base método printArea function Shape:printArea () print("Área", self.area) end -- Crear objeto myshape = Shape:new (nil,10) myshape:printArea () Square = Shape:new () -- Método de clase derivada new function Square:new (o, lado) o = o o Shape:new (o, lado) setmetatable (o, self) self.__index = self return o end -- Método de clase derivada printArea function Square:printArea () print("Área del cuadrado", self.area) end -- Crear objeto mysquare = Square:new (nil,10) mysquare:printArea () Rectangle = Shape:new () -- Método de clase derivada new function Rectangle:new (o, longitud, ancho) o = o o Shape:new (o) setmetatable (o, self) self.__index = self self.area = longitud * ancho return o end -- Método de clase derivada printArea function Rectangle:printArea () print("Área del rectángulo", self.area) end -- Crear objeto myrectangle = Rectangle:new (nil,10,20) myrectangle:printArea ()
Ejecutando el código anterior, el resultado de salida es:
Área 100 Área del cuadrado 100 Área del rectángulo 200
En Lua podemos sobrescribir funciones de la clase base, definiendo nuestra propia implementación en la clase derivada:
-- Método de clase derivada printArea function Square:printArea () print("Área del cuadrado", self.area) end