Lua 객체 지향

4565 단어 lua
개체 중심 피쳐
1) 봉인: 하나의 실체의 정보, 기능, 응답을 하나의 단독 대상에 불러올 수 있는 특성을 말한다.
2) 상속: 상속의 방법은 원래 프로그램을 바꾸지 않는 토대에서 이를 확충하여 원래 기능을 보존하고 새로운 기능도 확장할 수 있도록 한다.이것은 중복 인코딩을 줄이고 소프트웨어의 개발 효율을 높이는 데 유리하다.
3) 다태: 같은 조작이 서로 다른 대상에 작용하여 서로 다른 해석을 하고 서로 다른 집행 결과를 낼 수 있다.실행할 때, 기본 클래스를 가리키는 지침을 통해 파생 클래스를 실현하는 방법을 호출할 수 있다.
4) 추상: 추상(Abstraction)은 복잡한 현실 문제를 간소화하는 경로로 구체적인 문제에 대해 가장 적절한 클래스 정의를 찾을 수 있고 가장 적절한 계승 단계에서 문제를 해석할 수 있다.
 
Lua에서 객체 지향
우리는 대상이 속성과 방법으로 구성되어 있다는 것을 안다.LUA의 가장 기본적인 구조는 테이블이기 때문에 테이블로 대상의 속성을 설명해야 한다.lua의function는 방법을 나타낼 수 있습니다.그러면 LUA의 클래스는 table + function을 통해 시뮬레이션할 수 있습니다.계승에 관해서는metetable를 통해 시뮬레이션할 수 있다(추천하지 않고 가장 기본적인 대상의 대부분 시간만 시뮬레이션하면 충분하다).
Lua의 표는 어떤 의미에서 대상일 뿐만 아니라대상과 마찬가지로 표에도 상태(구성원 변수)가 있다.대상의 값과 독립된 본성도 있다. 특히 두 개의 서로 다른 값을 가진 대상(table)은 두 개의 서로 다른 대상을 대표한다.하나의 대상은 서로 다른 때에도 서로 다른 값을 가질 수 있지만 그는 시종일관 하나의 대상이다.객체와 마찬가지로 테이블의 라이프 사이클은 작성된 항목, 작성된 항목과 관계가 없습니다.객체에는 다음과 같은 구성원 함수가 있습니다.
Account = {balance = 0}
function Account.withdraw (v)
    Account.balance = Account.balance - v
end

이 정의는 Account 객체의 withdraw 도메인에 저장된 새 함수를 만듭니다. 다음과 같이 호출할 수 있습니다.
Account.withdraw(100.00)

 
간단한 실례
다음 간단한 클래스는 세 가지 속성을 포함합니다:area,length,breadth,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

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

https://www.yuque.com/docs/share/9f5f986c-17a2-40ad-bf7a-372705268ae4

좋은 웹페이지 즐겨찾기