Latest web development tutorials

루아 객체 지향

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