lua中基類和「繼承機制」

2022-05-02 21:27:08 字數 3842 閱讀 6187

基類:基類定義了所有對於派生類來說普通的屬性和方法,派生類從基類繼承所需的屬性和方法,且在派生類中增加新的屬性和方法。

繼承:繼承是c++語言的一種重要機制,它允許在已定義的類的基礎上產生新類。

lua基類和c++基類極為相似,但是lua中卻沒有繼承這一說,更沒有所謂的派生類。lua只能通過一種行為(元表)來模擬c++繼承這一方法。

元表:lua中提供的元表是用於幫助lua資料變數完成某些非預定義功能的個性化行為,當它做某一種操作,然而self表中卻沒有定義實現這種操作的方法,那麼為了實現這一操作便會去元表中找實現這一操作的方法。

如果每一層的元表都定義一種方法指向上一層要「繼承」的lua表,這樣是不是就和c++繼承一樣了,有木有!

元方法:c++中的繼承不會改變語言的常規行為。但是lua中卻提供了一種可以改變table行為的方法,有兩種可以改變的table行為:(__index元方法)查詢table及(__newindex元方法)修改table中不存在的字段

(1)__index元方法:當對元表中不存在的字段進行訪問時,得到的結果為nil。通過定義這個元表的__index,那個訪問結果將由這個方法決定。

這個方法也是「繼承」父類的方法。

(2)__newindex元方法:當對元表中不存在的字段進行賦值時,直譯器會先找到這個元表的__newindex,如果有就呼叫它,對__newindex指向的表進行賦值操作, 如果沒有才對self表進行賦值。

1

--儲存類型別的虛表

2local

_class ={}

34 global_obj_count ={}

5 enable_obj_count = 067

function

findclassname(target, depth)

8for key,value in

pairs(_g) do

9if value == target then

10return

key11

end12

end13

end14

15function

clascountretain(c)

16local key =findclassname(c)

17if global_obj_count[key] == nil

then

18 global_obj_count[key] = 1

19else

20 global_obj_count[key] = global_obj_count[key] + 1

21end

22end

2324

function

clascountrelease(c)

25local key =findclassname(c)

26if global_obj_count[key] == nil

then

27 global_obj_count[key] = -100000

--標識異常

28else

29 global_obj_count[key] = global_obj_count[key] - 1

30end

31end

3233

3435

36function

printluaclasscount( ... )

37print("

printluaclasscount.............")

38for key,value in

pairs(global_obj_count) do

39print("

printluaclasscount:

"..key..":"

,value)

40end

41end

4243

44function

baseclass(super)

4546

--生成乙個類型別

47local class_type ={}

48--

在建立物件的時候自動呼叫

49 class_type.__init = false

50 class_type.__delete = false

51 class_type.super =super

5253 class_type.new = function(...) --

定義new成員方法

54--

生成乙個類物件

55local obj ={}

56 obj._class_type =class_type

5758

--在初始化之前註冊基類方法

59setmetatable(obj, )

6061

--呼叫初始化方法

62do

63local

create

64 create = function

(c, ...)

65if c.super then

66 create(c.super, ...) --

對所有基類都進行init

67end

68if enable_obj_count ~= 0

then

69clascountretain(c)

70end

71if c.__init then

72c.__init(obj, ...)

73end

74end

7576

create(class_type, ...)

77end

7879

--註冊乙個delete方法

80 obj.deleteme = function

(self)

81local now_super = self._class_type

82while now_super ~= nil

do83

if enable_obj_count ~= 0

then

84clascountrelease(now_super)

85end

86if now_super.__delete then

87 now_super.__delete(self) --

對所有基類都進行delete

88end

89 now_super =now_super.super

90end

91end

9293

return

obj94

end95

96local vtbl ={}

97_class[class_type] =vtbl

9899

setmetatable(class_type, )

106107

if super then

108setmetatable(vtbl, )

114end

115116

return

class_type

117end

view code

lua 實現類 和 繼承

lua 實現類 繼承 需要以 table 表 的形式實現 table lua的資料結構之一 setmetatable a,b 設定a的元表為b 設定完元表之後 還要將 b的 index 指向自身 這樣的話 在a中查詢元素找不到的話,就會去b中查詢 如果b的 index沒有賦值,那麼及時b中存在也會返...

繼承 基類和派生類

說明派生類的生成和使用 include using namespace std class test1 基類 test1 int a x a void disp class test2 public test1 派生類 test2 int a,int b test1 a void disp intm...

虛繼承和虛基類

虛繼承主要解決在多重繼承中的菱形繼承問題,也就是說 b和c類同時繼承了a類,然後d類繼承了b,c類,那麼d類的虛表就會有重複的函式指標。include using namespace std 虛基類 class person person person string name name name e...