Lua實現鏈表(面向對象應用)

Lua實現面向對象

  • 面向對象核心三要素
  • Lua面向對象大致原理
    • 面向對象示例
    • 繼承與多態示例

面向對象核心三要素

1.封裝:對一個事物的抽象為一些屬性和行為動作的集合,封裝將屬性和行為動作(操作數據的方法)綁定在一起,并隱藏對象的內部實現細節,只暴露給外部部分接口。
2. 繼承是一種機制,允許一個類(子類)繼承另一個類(父類)的屬性和方法,從而實現代碼重用和擴展。
3. 多態允許一個接口或方法在不同類的實例上有不同的表現形式。通過多態,可以編寫更通用、更靈活的代碼。

Lua面向對象大致原理

在 Lua 中,面向對象編程(OOP)的概念是通過表(table)和元表(metatable)來實現的。Lua 并沒有內建的類系統,但通過靈活的元表機制,可以實現類、繼承和多態等 OOP 特性。

面向對象示例

-- 下面通過實現一個簡易的鏈表功能,來展示Lua實現面向對象的大致過程
local Node = {}
Node.__index = Node
Node.new = function(value)return setmetatable({value = value,next = nil},Node)
endlocal LinkList = {}
LinkList.__index = LinkList
LinkList.new = function()return setmetatable({head = nil},LinkList)
end
function LinkList:Insert(value)local node = Node.new(value)if not self.head thenself.head = nodeelselocal curNode = self.headwhile curNode.next docurNode = curNode.nextendcurNode.next = nodeend
endfunction LinkList:InsertByTable(valuetbl)for k,v in ipairs(valuetbl) dolocal node = Node.new(v)if not self.head thenself.head = nodeelselocal curNode = self.headwhile curNode.next docurNode = curNode.nextendcurNode.next = nodeendend
endfunction LinkList:Print()if not self.head thenprint("List has no node")elselocal curNode = self.headwhile curNode doprint("Cur Node Value:",curNode.value)curNode = curNode.nextendend
endfunction LinkList:Reverse()if not self.head thenprint("List has no node")elselocal preNode = nillocal curNode = self.headwhile curNode dolocal nextNode = curNode.nextcurNode.next = preNodepreNode = curNodecurNode = nextNodeendself.head = preNodeend
endlocal l = LinkList.new()
--l:Insert(2)
--l:Insert(4)
--l:Insert(5)
--l:Insert(1)
--l:Insert(0)
l:InsertByTable({1,2,3,4,"a"})
l:Print()
print("---------------------")
l:Reverse()
l:Print()

繼承與多態示例

-- 定義一個基類
local Shape = {}
Shape.__index = Shapefunction Shape:new()local instance = setmetatable({}, self)return instance
endfunction Shape:area()return 0
end-- 定義一個子類,繼承自 Shape
local Rectangle = setmetatable({}, Shape)
Rectangle.__index = Rectanglefunction Rectangle:new(width, height)local instance = Shape.new(self)instance.width = widthinstance.height = heightreturn instance
endfunction Rectangle:area()return self.width * self.height
end-- 定義另一個子類,繼承自 Shape
local Circle = setmetatable({}, Shape)
Circle.__index = Circlefunction Circle:new(radius)local instance = Shape.new(self)instance.radius = radiusreturn instance
endfunction Circle:area()return math.pi * self.radius ^ 2
end-- 創建子類的實例,并展示多態行為
local shapes = {Rectangle:new(3, 4), Circle:new(5)}for _, shape in ipairs(shapes) doprint("Area:", shape:area())  -- 分別輸出矩形和圓的面積
end

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

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

相關文章

快錢支付股東全部股權已被質押!

根據近期工商信息,第三方支付機構快錢支付清算信息有限公司(簡稱“快錢支付”)實際控股方快錢金融服務(上海)有限公司(簡稱“快錢金融”),作為出質股權標的企業,被出質給…

【SGX系列教程】(三)Intel-SGX 官方示例分析(SampleCode)——SampleEnclave

文章目錄 一. 引言二. README2.1 項目目的2.2 構建和執行示例代碼的步驟2.3 配置參數解釋2.4 配置文件分析2.5 啟動令牌初始化 三. 重點代碼分析3.1 App文件夾3.1.1 App/App.cpp3.1.2 App/Edger8rSyntax文件夾3.1.2.1 App/Edger8rSyntax/Arrays.cpp3.1.2.2 App/Edger8rSyntax/F…

一文全概括,建議收藏,那些你不可錯過的IC設計書籍合集(可下載)

集成電路設計工程師的角色不僅是推動技術創新的中堅力量,更是實現產品從概念到現實的關鍵橋梁。隨著對高性能、低功耗芯片的需求不斷增長,IC設計工程師的專業技能和知識深度成為了衡量其職業價值的重要標準。無論是在數字邏輯設計、功能驗證、可測試性設…

JMeter--定時執行的方法

原文網址:JMeter--定時執行的方法_IT利刃出鞘的博客-CSDN博客 簡介 本文介紹JMeter如何使用定時器定時執行測試任務。 Java技術星球:way2j.com 方法 第一步:新建定時器 右鍵測試任務> Add > Timer> Constant Timer 如下圖所示…

qt中數據庫和excel互導數據————附帶詳細步驟和代碼

文章目錄 0 背景1 準備QXlsx環境1.1 cmake安裝使用1.2 qmake使用 2 把excel數據導出到mysql數據庫3 把mysql數據庫的數據寫入到excel4 完整代碼5 項目代碼倉庫 0 背景 因為需要批量導入和導出數據,所以需要用到excel。實現把數據庫的數據導入到excel中,…

圓圈序號1~10復制粘貼直接用

1. 空心圓圈數字序號: ①、②、③、④、⑤、⑥、⑦、⑧、⑨、⑩ 2. 實心圓圈數字序號: ?、?、?、?、?、?、?、?、?、? 3. 空心圓圈中文序號: 一、二、三、四、五、六、七、八、九、十

linux高級編程(線程)(1)

虛擬地址: 線程: 概念:線程是輕量級進程,一般是一個進程中的多個任務。 進程是系統中最小的資源分配單位。(競爭計算機資源的最小單位)(進程能分配硬件資源,線程不行&#x…

解析QAnything啟動命令過程

一.啟動命令過程日志 啟動命令bash ./run.sh -c local -i 0 -b hf -m Qwen-1_8B-Chat -t qwen-7b-chat。輸入日志如下所示: rootMM-202203161213:/mnt/l/20230918_RAG方向/QAnything# bash ./run.sh -c local -i 0 -b hf -m Qwen-1_8B-Chat -t qwen-7b-chat From …

Leetcode Java學習記錄——棧和隊列 IDEA

文章目錄 棧和隊列stack Classqueue InterfaceDeque Interfaceadd 和 push Priority Queue -- Class題目 codestyleIDEA 操作快捷鍵選擇代碼生成類 棧和隊列 stack Class google stack java 8/12 empty() peek() pop() push(E item) search(Object o) 最近相關性會用到棧 …

湘潭大學軟件工程數據庫總結

文章目錄 前言試卷結構給學弟學妹的一些參考自己的一些總結 前言 自己可能很早很早之前就準備復習了,但是感覺還是沒有學到要點,主要還是沒啥緊迫的壓力,我們是三月份開學,那時候實驗室有朋友挺認真開始學習數據庫了,…

理性決策的藝術:從購房到擇偶的數學智慧;37% 規則,做出最佳決策的秘訣;用數學模型解決人生難題

在面對人生重大決策時,如購房或擇偶,我們常常感到迷茫和困惑。然而,如果我們能夠將這些看似復雜的問題簡化為數學模型,我們就能以更加理性和系統的方式做出決策。 37%規則 1950年代,當時幾位數學家開始研究這樣一個問…

值得收藏!盤點那些適合普通人方便又好用的AIGC工具!(下)

【導讀】接上一篇文章,盤點國內外適合普通人能夠輕松上手的AIGC工具(上)。今天又為大家整理了一些好用又方便的AI設計工具、AI辦公工具、AI編程工具、AI指令工具和AI檢測工具,如果有沒更新到的工具也歡迎大家評論區交流。 一 、A…

Kafka 入門指南

Kafka 入門指南 簡介 Kafka 是一個由 Apache 軟件基金會開發的開源流處理平臺。它最初由 LinkedIn 開發,并在 2011 年作為開源項目發布。Kafka 是一個分布式、可擴展、高吞吐量的消息隊列系統,廣泛應用于實時數據流處理場景。 主要概念 1. 主題 (Top…

C#/WPF 自制截圖工具

在日常使用電腦辦公時,我們經常遇到需要截圖然后保存圖片,我們往往需要借助安裝截圖工具才能實現,現在我們通過C#自制截圖工具,也能夠輕松進行截圖。 我們可以通過C#調用WindousAPI來實現截圖,實例代碼如下&#xff1a…

AI基本概念(人工智能、機器學習、深度學習)

人工智能 、 機器學習、 深度學習的概念和關系 人工智能 (Artificial Intelligence)AI- 機器展現出人類智慧機器學習 (Machine Learning) ML, 達到人工智能的方法深度學習 (Deep Learning)DL,執行機器學習的技術 從范圍…

算法 —— 滑動窗口

目錄 長度最小的子數組 無重復字符的最長子串 最大連續1的個數 將x減到0的最小操作數 找到字符串中所有字母異位詞 長度最小的子數組 sum比target小就進窗口,sum比target大就出窗口,由于數組是正數,所以相加會使sum變大,相減…

關于redis的運維面試題-1

1. 什么是Redis? Redis(Remote Dictionary Server)是一個開源的內存數據結構存儲,通常用作數據庫、緩存和消息代理。它支持多種數據結構,如字符串(strings)、哈希(hashes&#xff0…

大二暑假 + 大三上

希望,暑假能早睡早起,胸圍達到 95,腰圍保持 72,大臂 36,小臂 32,小腿 38🍭🍭 目錄 🍈暑假計劃 🌹每周進度 🤣寒假每日進度😂 &…

DiskGeniusV5.6.0.1565發布!

DiskGenius是一款功能強大的磁盤管理和數據恢復工具,V5.6.0.1565上線。新版本變化比較大,增加新的功能,修正已經問題,值得試一下。提醒大家,磁盤管理軟件涉及數據安全,請始終使用最新版本! 下面…

JS hook

參照: JS 逆向之 Hook JS Hook 與 過 debugger 一、常用Hook 1. eval (function() {let _eval eval;eval function(val) {if (val.indexof(debugger) -1) {_eval_cache(obj);}} })(); 2. JSON.parse() (function () {var parse_ JSON.parse;JSON.parse …