Lua - 垃圾回收



面向物件程式設計簡介

面向物件程式設計(OOP)是現代程式設計時代最常用的程式設計技術之一。有很多程式語言支援 OOP,包括:

  • C++
  • Java
  • Objective-C
  • Smalltalk
  • C#
  • Ruby

OOP 的特性

  • - 類是建立物件的擴充套件模板,提供狀態(成員變數)的初始值和行為的實現。

  • 物件 - 它是類的例項,併為自身分配了單獨的記憶體。

  • 繼承 - 它是一個概念,一個類的變數和函式被另一個類繼承。

  • 封裝 - 它是在類內部組合資料和函式的過程。資料可以透過函式在類外部訪問。它也稱為資料抽象。

Lua 中的 OOP

您可以使用 Lua 的表格和一等函式在 Lua 中實現面向物件。透過將函式和相關資料放入表格中,就形成了一個物件。繼承可以透過元表來實現,為父物件中不存在的函式(方法)和欄位提供查詢機制。

Lua 中的表格具有物件的狀態和身份等特性,這些特性獨立於其值。兩個具有相同值的物件(表格)是不同的物件,而一個物件可以在不同的時間具有不同的值,但它始終是相同的物件。像物件一樣,表格的生命週期獨立於誰建立它們或在哪裡建立它們。

一個真實的例子

面向物件的概念被廣泛使用,但您需要清楚地理解它才能獲得適當和最大的益處。

讓我們考慮一個簡單的數學例子。我們經常遇到處理不同形狀(如圓形、矩形和正方形)的情況。

這些形狀可以具有一個共同的屬性“面積”。因此,我們可以從具有共同屬性“面積”的基本物件“形狀”擴充套件其他形狀。每個形狀都可以有自己的屬性和函式,例如,矩形可以具有屬性長度、寬度、面積作為其屬性,以及 printArea 和 calculateArea 作為其函式。

建立簡單的類

下面顯示了具有三個屬性(面積、長度和寬度)的矩形的簡單類實現。它還具有一個 printArea 函式來列印計算出的面積。

-- Meta class
Rectangle = {area = 0, length = 0, breadth = 0}

-- Derived class method 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

-- Derived class method printArea

function Rectangle:printArea ()
   print("The area of Rectangle is ",self.area)
end

建立物件

建立物件是為類例項分配記憶體的過程。每個物件都有自己的記憶體,並共享公共類資料。

r = Rectangle:new(nil,10,20)

訪問屬性

我們可以使用點運算子訪問類中的屬性,如下所示:

print(r.length)

訪問成員函式

您可以使用冒號運算子和物件一起訪問成員函式,如下所示:

r:printArea()

記憶體被分配,並且設定了初始值。初始化過程可以與其他面嚮物件語言中的建構函式進行比較。它只不過是一個允許設定值的函式,如上所示。

完整示例

讓我們看看在 Lua 中使用面向物件的完整示例。

main.lua

-- Meta class
Shape = {area = 0}

-- Base class method 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

-- Base class method printArea

function Shape:printArea ()
   print("The area is ",self.area)
end

-- Creating an object
myshape = Shape:new(nil,10)

myshape:printArea()

輸出

執行上述程式時,您將獲得以下輸出。

The area is 	100

Lua 中的繼承

繼承是將簡單的基本物件(如形狀)擴充套件到矩形、正方形等的過程。它通常用於現實世界中以共享和擴充套件基本屬性和函式。

讓我們看看一個簡單的類擴充套件。我們有一個如下所示的類。

-- Meta class
Shape = {area = 0}

-- Base class method 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

-- Base class method printArea

function Shape:printArea ()
   print("The area is ",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

覆蓋基函式

我們可以覆蓋基類函式,即,而不是使用基類中的函式,派生類可以有自己的實現,如下所示:

-- Derived class method printArea

function Square:printArea ()
   print("The area of square is ",self.area)
end

繼承完整示例

我們可以使用元表在 Lua 中擴充套件上面顯示的簡單類實現,並使用另一種新方法。基類中的所有成員變數和函式都保留在派生類中。

main.lua

-- Meta class
Shape = {area = 0}

-- Base class method 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

-- Base class method printArea

function Shape:printArea ()
   print("The area is ",self.area)
end

-- Creating an object
myshape = Shape:new(nil,10)
myshape:printArea()

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

-- Derived class method printArea

function Square:printArea ()
   print("The area of square is ",self.area)
end

-- Creating an object
mysquare = Square:new(nil,10)
mysquare:printArea()

Rectangle = Shape:new()

-- Derived class method 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

-- Derived class method printArea

function Rectangle:printArea ()
    print("The area of Rectangle is ",self.area)
end

-- Creating an object

myrectangle = Rectangle:new(nil,10,20)
myrectangle:printArea()

輸出

當我們執行上述程式時,我們將得到以下輸出:

The area is 	100
The area of square is 	100
The area of Rectangle is 	200

在上面的示例中,我們從基類 Square 建立了兩個派生類 - Rectangle 和 Square。可以在派生類中覆蓋基類的函式。在此示例中,派生類覆蓋了函式 printArea。

廣告

© . All rights reserved.