面向?qū)ο缶幊?OOP)是現(xiàn)代編程時代中使用最廣泛的編程技術之一。
OOP的特征
類(Class)? ? ? ? ? ? ? ? ? ? ? ?- 類是用于創(chuàng)建對象的可擴展模板。
對象(Objects)? ? ? ? ? ? ? ?- 它是類的實例,并為其分配了單獨的內(nèi)存空間。
繼承(Inheritance)? ? ? ?- 這是一個概念,一個類的變量和函數(shù)被另一類繼承。
封裝(Encapsulation)? - 這是將數(shù)據(jù)和函數(shù)合并到一個類中的過程。
您可以借助Table和Lua的一流函數(shù)在Lua中實現(xiàn)面向?qū)ο?。通過將函數(shù)和相關數(shù)據(jù)放入表中,可以形成一個對象。繼承可以在Meta的幫助下實現(xiàn),它為父對象中不存在的函數(shù)(方法)和字段提供了一種查找機制。
Lua中的Table具有獨立其值的對象特征。具有相同值的兩個對象是不同的對象,而一個對象在不同時間可以具有不同的值,但是它始終是同一對象。
讓無涯教程考慮一個簡單的數(shù)學示例。經(jīng)常遇到需要處理不同形狀(如圓形,矩形和正方形)的情況。
形狀可以具有公共屬性Area。因此,可以從具有公共屬性區(qū)域的基礎對象形狀擴展其他形狀。每個形狀都可以具有自己的屬性和函數(shù),如矩形可以具有屬性長度,寬度,面積作為其屬性,以及printArea和calculateArea作為其函數(shù)。
創(chuàng)建類
下面顯示了具有三個屬性區(qū)域,長度和寬度的矩形的簡單類實現(xiàn)。它還具有printArea函數(shù)以打印計算出的區(qū)域。
-- 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
創(chuàng)建對象
創(chuàng)建對象是為類分配內(nèi)存的過程。每個對象都有其自己的內(nèi)存并共享公共類數(shù)據(jù)。
r=Rectangle:new(nil,10,20)
訪問屬性
無涯教程可以使用點運算符訪問類中的屬性,如下所示:
print(r.length)
訪問函數(shù)
您可以使用帶有該對象的冒號運算符訪問成員函數(shù),如下所示-
r:printArea()
分配內(nèi)存并設置初始值??梢詫⒊跏蓟^程與其他面向?qū)ο笳Z言的構造函數(shù)進行比較。
完整的示例
來看一個在Lua中使用面向?qū)ο蟮耐暾纠?/p>
-- 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 繼承
繼承是將簡單的基礎對象(如形狀)擴展為矩形,正方形等的過程。它在現(xiàn)實世界中經(jīng)常用于共享和擴展基本屬性和函數(shù)。
來看一個簡單的類擴展。有一個如下所示的類。
-- 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
Lua 覆蓋
可以覆蓋基類函數(shù),而不是使用基類中的函數(shù),派生類可以有自己的實現(xiàn),如下所示:
-- Derived class method printArea function Square:printArea () print("The area of square is ",self.area) end
Lua 繼承示例
無涯教程可以借助另一個新方法,借助元表,來擴展Lua中的簡單類實現(xiàn),如上所示?;惖乃谐蓡T變量和函數(shù)都保留在子類中。
-- 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創(chuàng)建了兩個派生類-Rectangle和Square??梢栽谂缮愔兄貙懟惖暮瘮?shù)。在此示例中,派生類覆蓋函數(shù)printArea。文章來源:http://www.zghlxwxcb.cn/news/detail-629410.html
Lua - 面向?qū)ο?- 無涯教程網(wǎng)無涯教程網(wǎng)提供面向?qū)ο缶幊?OOP)是現(xiàn)代編程時代中使用最廣泛的編程技術之一。 OOP的特征 類(Class)?...https://www.learnfk.com/lua/lua-object-oriented.html文章來源地址http://www.zghlxwxcb.cn/news/detail-629410.html
到了這里,關于無涯教程-Lua - 面向?qū)ο蟮奈恼戮徒榻B完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!