루아 객체 지향
OOP (객체 지향 프로그래밍, OOP)은 매우 인기있는 컴퓨터 프로그래밍 아키텍처입니다.
다음의 프로그래밍 언어는 객체 지향 프로그래밍을 지원
- C ++
- 자바
- 목표 - C
- 스몰 토크
- C #을
- 루비
객체 지향 기능
- 1) 패키지 : 정보, 기능에 기업의 능력을 의미 및 응답은 별도의 개체 속성에 배치됩니다.
- 2) 상속 : 상속 방법은, 본래의 기능이 유지 될 수 있도록, 그 팽창의 오리지널 프로그램의 기초를 변경할 수 있으며, 새로운 기능은 또한 확장되었다. 이 소프트웨어 개발의 효율성을 향상시키기 위해, 반복 코딩을 줄이는 것을 돕는다.
- 3) 다형성 : 다른 개체에 적용되는 동일한 동작이 다른 실행 귀결 상이한 해석을 가질 수있다. 런타임에서, 당신은 파생 클래스의 메소드를 호출 할 기본 클래스 포인터를 가리킬 수 있습니다.
- 4) 추상 : 추상 (추상화) 방식의 복잡한 현실을 단순화하기 위해, 그것은 가장 적합한 카테고리가 특정 문제로 정의되어 있는데, 가장 적절한 레벨의 상속 해석 될 수있다.
루아 객체 지향
우리가 알고있는 객체의 속성과 메소드의 조성 그. LUA는 가장 기본적인 구조 테이블이고, 오브젝트의 속성을 설명하는 테이블을 사용할 필요가있다.
LUA 함수 표현에 사용될 수있다. 이 클래스는 다음 LUA 테이블 + 기능을 시뮬레이션 할 수 있습니다.
상속에 관해서는 metetable으로 시뮬레이션 할 수 있습니다 (충분한 시간 만 대부분의 가장 기본적인 목적을 시뮬레이션하기 위해 권장하지 않음).
루아 테이블뿐만 아니라 의미에서, 객체입니다. 객체 마찬가지로 테이블 상태도 (멤버 변수)가, 또한 자연 오브젝트 독립의 값과 다른 값 (표) 두 개의 다른 물체를 나타내는 두 개의 개체, 특히 이들을 상이한 시간에 물체가 상이해도 값은,하지만 그는 항상 대상이되어왔다; 개체가 더 관계가 생성되지 않는 것을 자신의 라이프 사이클에 의해 생성 된 테이블과 유사합니다. 객체가 멤버 함수를 가지고 테이블도 있습니다
Account = {balance = 0} function Account.withdraw (v) Account.balance = Account.balance - v end
이 정의는 새로운 기능을 생성하고 계정 개체 내에서 철수를 저장, 우리는 다음을 호출 할 수 있습니다 :
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()
오브젝트가 초기화되는 메모리 할당.
전체 예제
우리는 루아 객체 지향 완전한 예제를 보여 아래 :
-- 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
루아 상속
상속은 직접 속성과 다른 개체의 메서드를 사용하여 객체를 의미한다. 속성 및 메소드들은베이스 클래스를 확장 할 수있다.
다음은 간단한 상속 예를 보여
-- 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: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
기능 대체
루아는, 우리는 파생 클래스에서 자신의 구현을 정의, 기본 클래스 기능을 다시 작성할 수 있습니다 :
-- 派生类方法 printArea function Square:printArea () print("正方形面积 ",self.area) end