- Lua 教程
- Lua - 首頁
- Lua 基礎
- Lua - 概述
- Lua - 環境
- Lua - 基本語法
- Lua - 註釋
- Lua - 列印 Hello World
- Lua - 變數
- Lua - 資料型別
- Lua - 運算子
- Lua - 迴圈
- Lua - 決策
- Lua - 函式
- Lua - 日期和時間
- Lua 陣列
- Lua - 陣列
- Lua - 多維陣列
- Lua - 陣列長度
- Lua - 遍歷陣列
- Lua 迭代器
- Lua - 迭代器
- Lua 列表
- Lua - 在列表中搜索
- Lua 模組
- Lua - 模組
- Lua - 名稱空間
- Lua 元表
- Lua - 元表
- Lua 協程
- Lua - 協程
- Lua 檔案處理
- Lua - 檔案 I/O
- Lua 庫
- Lua - 標準庫
- Lua - 數學庫
- Lua - 作業系統功能
- Lua 有用資源
- Lua - 快速指南
- Lua - 有用資源
- Lua - 討論
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。