Lua語言入門 - Lua 面向對象

Lua 面向對象

面向對象編程(Object Oriented Programming,OOP)是一種非常流行的計算機編程架構,通過創建和操作對象來設計應用程序。

以下幾種編程語言都支持面向對象編程:

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

Lua 是一種輕量級的腳本語言,雖然它不像 Java 或 C++ 那樣內置強大的面向對象(OO)特性,但它非常靈活,可以通過一些技巧實現面向對象編程。

面向對象特征

  • 封裝:將數據和方法捆綁在一起,隱藏實現細節,只暴露必要的接口,提高安全性和可維護性。

  • 繼承:通過派生新類復用和擴展現有代碼,減少重復編碼,提高開發效率和可擴展性。

  • 多態:同一操作作用于不同對象時表現不同,支持統一接口調用,增強靈活性和擴展性。

  • 抽象:簡化復雜問題,定義核心類和接口,隱藏不必要的細節,便于管理復雜性。

Lua 中面向對象

我們知道,對象由屬性和方法組成。

Lua 中的類可以通過?table + function?模擬出來。

至于繼承,可以通過 metetable 模擬出來(不推薦用,只模擬最基本的對象大部分實現夠用了)。

在 Lua 中,最基本的結構是 table,我們可以使用表(table)來創建對象。

ClassName = {}  -- 創建一個表作為類

通過 new 方法(或其他名稱)創建對象,并初始化對象的屬性。

function ClassName:new(...)local obj = {}  -- 創建一個新的空表作為對象setmetatable(obj, self)  -- 設置元表,使對象繼承類的方法self.__index = self  -- 設置索引元方法-- 初始化對象的屬性obj:init(...)  -- 可選:調用初始化函數return obj
end

表(table)是 Lua 中最基本的復合數據類型,可以用來表示對象的屬性。

Lua 中的 function 可以用來表示方法:

function ClassName:sayHello()print("Hello, my name is " .. self.name)
end

?使用 new 方法來創建對象,并通過對象調用類的方法。

local obj = ClassName:new("Alice")  -- 創建對象
obj:sayHello()  -- 調用對象的方法
-- 定義 Person 類
Person = {name = "", age = 0}-- Person 的構造函數
function Person:new(name, age)local obj = {}  -- 創建一個新的表作為對象setmetatable(obj, self)  -- 設置元表,使其成為 Person 的實例self.__index = self  -- 設置索引元方法,指向 Personobj.name = nameobj.age = agereturn obj
end-- 添加方法:打印個人信息
function Person:introduce()print("My name is " .. self.name .. " and I am " .. self.age .. " years old.")
end

代碼說明:

  • Person?是一個表,它有兩個屬性:name 和 age,這兩個屬性是類的默認屬性。
  • Person:new(name, age)?是一個構造函數,用來創建新的 Person 對象。
  • local obj = {}?創建一個新的表作為對象,setmetatable(obj, self) 設置元表,使得該表成為 Person 類的實例。
  • self.__index = self?設置索引元方法,使得 obj 可以訪問 Person 類的屬性和方法。
  • introduce?是 Person 類的方法,打印該 Person 對象的名字和年齡。

調用方法:

-- 創建一個 Person 對象
local person1 = Person:new("Alice", 30)-- 調用對象的方法
person1:introduce()  -- 輸出 "My name is Alice and I am 30 years old."

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63668.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63668.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63668.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Pyqt6在lineEdit中輸入文件名稱并創建或刪除JSON文件

1、創建JSON文件 代碼 import osdef addModulekeyWordFile(self):if "" ! self.lineEdit_module.text():moduleFile self.lineEdit_module.text() .jsonelse:self.toolLogPrinting(請輸入模塊名稱)returnfilePath modulekeyWordFileDir moduleFileif os.path.e…

【Leetcode 熱題 100】236. 二叉樹的最近公共祖先

問題背景 給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。 最近公共祖先的定義為:對于有根樹 T T T 的兩個節點 p p p、 q q q,最近公共祖先表示為一個節點 x x x,滿足 x x x 是 p p p、 q q q 的祖先且 x x x 的深度盡可能大…

數據結構--堆的向上調整和向下調整

文章目錄 1.完全二叉樹2.堆向上調整3.堆向下調整4.測試代碼 1.完全二叉樹 下面的這個就是對于我們的完全二叉樹的這個邏輯結構和物理結構的說明: 邏輯結構就是我們自己認為的進行購想出來的; 但是這個物理結構卻是我們的這個數據結構在內存里面的真是…

智能掛號系統設計典范:SSM 結合 Vue 在醫院的應用實現

摘要 隨著信息技術在管理上越來越深入而廣泛的應用,管理信息系統的實施在技術上已逐步成熟。本文介紹了醫院預約掛號系統的開發全過程。通過分析醫院預約掛號系統管理的不足,創建了一個計算機管理醫院預約掛號系統的方案。文章介紹了醫院預約掛號系統的系…

“魔法糖果盒的秘密:用樸素貝葉斯算法猜糖果顏色”

想象一下,你有一個神奇的糖果盒,這個糖果盒里有兩種糖果:紅色的和藍色的。你閉上眼睛,從盒子里拿出一個糖果,然后嘗一嘗,你想知道這個糖果是紅色的還是藍色的。樸素貝葉斯算法就像是一個魔法規則&#xff0…

Transform組件的用法

文章目錄 1. 概念介紹2. 使用方法3. 示例代碼我們在上一章回中介紹了Checkbox Widget相關的內容,本章回中將介紹Transform Widget.閑話休提,讓我們一起Talk Flutter吧。 1. 概念介紹 我們在這里說的Transform是一種容器類widget,它和Container組件類似。它可以包含其它的組件…

go面試問題

1 Go的內存逃逸如何分析 go build -gcflags-m main_pointer.go 2 http狀態碼 300 請求的資源可包括多個位置,相應可返回一個資源特征與地址的列表用于用戶終端(例如:瀏覽器)選擇 301 永久移動。請求的資源已被永久的移動到新U…

康冠科技嵌入式面試題及參考答案

LCD 驅動你自己做了哪些內容? 在 LCD 驅動開發中,首先是硬件層面的理解。需要仔細研究 LCD 的數據手冊,明確其引腳定義,包括電源引腳、數據引腳、控制引腳等。比如,對于常見的 RGB 接口 LCD,要清楚哪幾個引腳是用于傳輸紅、綠、藍三種顏色的數據,以及像 VSYNC(垂直同步…

TouchGFX移植(5)增加觸屏驅動

一)增加驅動代碼gt9xxx.c和ctiic.c到工程中的BSP目錄下: 二)更改觸摸文件STM32TouchController.cpp 1)在STM32TouchController.cpp文件中增加: #include “gt9xxx.h” 2)增加gt9xxx_init(); void STM32TouchControlle…

初識面向對象晨考day09

1.類和對象什么關系 類是對象的抽象 對象是類的具體 2.什么是屬性和方法 一類事物共有的特征,使用屬性描述 一類事物共有的行為,使用方法描述 3.普通方法的定義格式 public 返回值類型 方法名(參數列表){} 4.什么是形參,什么是實參 形參是方法…

資源型數字化平臺該如何順利運營?

一、引言 隨著信息技術的迅猛發展,資源型數字化平臺在各領域的重要性日益凸顯。此類平臺整合各類資源,以數字化手段提升資源利用效率與價值,但確保其順利運營面臨諸多挑戰。 二、資源型數字化平臺特點 資源型數字化平臺具有資源整合性&…

GitLab的安裝和使用

1.GitLab 環境說明 系統版本 CentOS 7.2 x86_64 軟件版本 gitlab-ce-10.8.4 GitLab 是一個用于倉庫管理系統的開源項目,使用Git作為代碼管理工具,并在此基礎上搭建起來的web服務。可通過Web界面進行訪問公開的或者私人項目。它擁有與Github類似的功能…

Leetcode 串聯所有單詞的子串

算法思想(中文解釋) 這道題目要求我們在字符串 s 中找到所有子串,這些子串是字符串數組 words 中所有單詞的串聯,并且每個單詞只能使用一次,且順序可以任意。下面是代碼的算法思想: 1. 核心思路 分解問題…

解析在OceanBase創建分區的常見問題|OceanBase 用戶問題精粹

在《分區策略和管理分區計劃的實踐方案》這篇文章中,我們介紹了在ODC中制定分區策略及有效管理分區計劃的經驗。有不少用戶在該帖下提出了使用中的問題,其中一個關于創建分區的限制條件的問題,也是很多用戶遭遇的老問題。因此本文以其為切入&…

有哪些免費的 ERP 軟件可供選擇?哪些 ERP 軟件使用體驗較好?

想找個 “免費” 的 ERP 軟件? 咱得知道,ERP 那可是涉及財務、人力、供應鏈、采購、銷售等好多方面的重要企業軟件。功能這么全,能免費才怪呢!真要是有免費的,早就火遍大江南北,說不定把市場都壟斷了&…

centos-stream9系統安裝docker

如果之前安裝過docker需要刪除之前的。 sudo dnf -y remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 安裝yum-utils工具: dnf -y install yum-utils dnf-plugin…

了解cuda的統一內存

1. CUDA 6中的統一內存 在CUDA 6中,從Kepler GPU架構(計算能力3.0或更高)開始,在64位Windows 7、8和Linux操作系統(內核2.6.18)上開始支持統一內存. 從CUDA 6開始,NVIDIA推出了CUDA平臺歷史上…

unity 最小后監聽鍵盤輸入

當Untiy最小化后,游戲窗口不會立刻失去焦點,此時依然可以使用Input來獲取按鍵,但是點擊其他窗口后,就會失去焦點,此時系統會把按鍵輸入分配到其他窗口里,此時要用windowsAPI獲取按鍵輸入,應對兩…

Pytorch | 從零構建MobileNet對CIFAR10進行分類

Pytorch | 從零構建MobileNet對CIFAR10進行分類 CIFAR10數據集MobileNet設計理念網絡結構技術優勢應用領域 MobileNet結構代碼詳解結構代碼代碼詳解DepthwiseSeparableConv 類初始化方法前向傳播 forward 方法 MobileNet 類初始化方法前向傳播 forward 方法 訓練過程和測試結果…

Electronjs+Vue如何開發PC桌面客戶端(Windows,Mac,Linux)

electronjs官網 https://www.electronjs.org/zh/ Electron開發PC桌面客戶端的技術選型非常適合已經有web前端開發人員的團隊。能夠很絲滑的過渡。 Electron是什么? Electron是一個使用 JavaScript、HTML 和 CSS 構建桌面應用程序的框架。 嵌入 Chromium 和 Node.…