Lua 객체지향
객체 지향 프로그래밍(OOP)은 매우 널리 사용되는 컴퓨터 프로그래밍 아키텍처입니다.
객체 지향 프로그래밍을 지원하는 프로그래밍 언어는 다음과 같습니다.
C++
Java
Objective-C
Smalltalk
C#
Ruby
객체 지향 기능
1) 캡슐화: 엔터티의 내용을 캡슐화하는 기능을 말합니다. 정보, 함수, 응답 속성은 별도의 개체에 로드됩니다.
2) 상속(Inheritance) : 상속 방식은 원래 프로그램을 변경하지 않고 확장할 수 있어 원래의 기능을 보존하고 새로운 기능을 확장할 수 있는 방식입니다. 이는 반복적인 코딩을 줄이고 소프트웨어 개발 효율성을 높이는 데 도움이 됩니다.
3) 다형성(Polymorphism): 동일한 작업이 다른 객체에 작용하고 다른 해석을 가지며 다른 실행 결과를 생성할 수 있습니다. 런타임 시 기본 클래스에 대한 포인터를 통해 파생 클래스의 메서드를 호출할 수 있습니다.
4) 추상화는 복잡한 실제 문제를 단순화하는 방법이며, 특정 문제에 가장 적합한 클래스 정의를 찾아 가장 적절한 상속 수준에서 설명할 수 있습니다. .
Lua의 객체지향
우리는 객체가 속성과 메소드로 구성되어 있다는 것을 알고 있습니다. LUA의 가장 기본적인 구조는 테이블이므로 개체의 속성을 설명하려면 테이블을 사용해야 합니다.
Lua의 함수는 메서드를 나타내는 데 사용할 수 있습니다. 그러면 LUA의 클래스는 테이블 + 함수를 통해 시뮬레이션될 수 있습니다.
상속의 경우 metable을 통해 시뮬레이션할 수 있습니다(권장하지 않으며 대부분의 경우 가장 기본적인 객체만 시뮬레이션하는 것으로 충분합니다).
루아에서 테이블은 어떤 의미에서 단순한 객체가 아닙니다. 객체와 마찬가지로 테이블에도 상태(멤버 변수)가 있습니다. 특히 두 개의 서로 다른 값을 갖는 객체(테이블)는 두 개의 서로 다른 객체를 나타낼 수 있습니다. 또한 시간에 따라 다른 값을 갖지만 항상 객체와 유사하므로 테이블의 수명 주기는 테이블이 생성되는 대상과 생성되는 위치와 아무 관련이 없습니다. 객체에는 멤버 함수가 있고 테이블에도 다음이 있습니다.
Account = {balance = 0} function Account.withdraw (v) Account.balance = Account.balance - v end
이 정의는 새 함수를 생성하고 이를 Account 객체의 철회 필드에 저장합니다. 아래에서는
Account.withdraw(100.00)<🎜를 호출할 수 있습니다. >간단한 예다음의 간단한 클래스에는 면적, 길이, 너비의 세 가지 속성이 포함되어 있습니다. printArea 메소드는 계산 결과를 인쇄하는 데 사용됩니다.
-- Meta class 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객체 만들기 객체 생성은 클래스 인스턴스에 메모리를 할당하는 프로세스입니다. 각 클래스는 자체 메모리를 가지며 공통 데이터를 공유합니다.
r = Rectangle:new(nil,10,20)액세스 속성마침표(.)를 사용하여 클래스 속성에 액세스할 수 있습니다.
print(r.length)멤버 함수 액세스다음을 사용할 수 있습니다. 클래스의 속성에 액세스하려면 콜론( :)을 사용하세요.
r:printArea()메모리는 객체가 초기화될 때 할당됩니다. 전체 예 아래에서는 Lua 객체 지향의 전체 예를 보여줍니다.
-- 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()위 프로그램을 실행하면 출력 결과는 다음과 같습니다.
面积为 100
Lua 상속
상속이란 한 개체가 다른 개체의 속성과 메서드를 직접 사용하는 것을 의미합니다. 기본 클래스를 확장하는 데 사용할 수 있는 속성 및 메서드입니다.
다음은 간단한 상속 예를 보여줍니다.
-- 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
다음 예에서는 Square 개체가 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
전체 예
다음 예: 파생 클래스의 메서드를 확장하기 위해 간단한 클래스를 상속합니다. 파생 클래스는 상속된 클래스의 멤버 변수와 메서드를 유지합니다.
-- 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
함수 재작성Lua에서는 기본 클래스의 함수를 재작성하고 파생 클래스에서 자체 구현을 정의할 수 있습니다.
-- 派生类方法 printArea function Square:printArea () print("正方形面积 ",self.area) end