-
Notifications
You must be signed in to change notification settings - Fork 0
/
OO.lua
143 lines (131 loc) · 3.57 KB
/
OO.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
---
--- Generated by EmmyLua(https://github.com/EmmyLua)
--- Created by KipKips.
--- DateTime: 2020.3.18 21:47
---
---面向对象编程
--写法一
person={ name="wkp",age=22}
person.eat=function()
print(person.name.."在吃饭")
end
function person.drink()
print(person.name.."在喝水")
end
person.eat()
person.drink()
--写法二
person={
name="wkp",
age=22,
eat=function ()
print(person.name.."在吃饭")
end
}
person.eat()
print("--------------------------------------------------------")
---上述两种方法在新建对象时,需要全部重新赋值,很不好,所以下面用一种相对简单的方法实现面向对象
person={
name="wkp",
age=22,
eat=function (self)
print(self.name.."在吃饭")
end
}
person.eat(person)
print("---------------------------------------------------------")
---上述方法在调用方法时,每次都要传递person参数,很麻烦
--改进
person={
name="wkp",
age=22
}
--当方法的声明使用:来声明时,就可以使用self参数,这个参数代表调用方法的对象,即person
function person:eat()
print(self.age.."岁的"..self.name.."在吃饭")
end
person:eat()
a=person
a.name="wjl"
a:eat()--使用:调用函数不用去传递参数
a.eat(a)--使用.调用函数需要传递参数
print("---------------------------------------------------------")
---添加构造函数
Person={
name,
age
}
function Person:eat()
print(self.age.."岁的"..self.name.."在吃饭")
end
--创建一个表的模板,通过使用模板达到类似构造函数的目的
--使用new方法创建新的表
function Person:new()
t={}
--t为元表,若调用属性时,该属性不存在,就在__index指向的表里面去查找
setmetatable(t,{__index=Person})
return t
end
--print(Person.name) --nil
p1=Person:new() --创建新的表
p1.name="wjl"
p1.age=23
p1:eat()
print("---------------------------------------------------------")
---对构造函数进行扩展
Person={
name,
age
}
function Person:eat()
print(self.age.."岁的"..self.name.."在吃饭")
end
--创建一个表的模板,通过使用模板达到类似构造函数的目的
--使用new方法创建新的表
function Person:new(o)
--若o为空,则t={},若o不为空,则t=o
local t = o or {} --防止外界访问到t
--t为元表,若调用属性时,该属性不存在,就在__index指向的表里面去查找
--1.
--setmetatable(t,{__index=Person})
--2.
setmetatable(t,self)
self.__index=self
return t
end
--使用新的构造函数
p1=Person:new(nil)--构造全新的对象,值全为空
print(p1.name,p1.age,p1.weight)
--有参构造函数,可以添加新的属性
p2=Person:new({name="wxy",age=26,weight=100})
print(p2.name,p2.age,p2.weight)
p2:eat()
print("---------------------------------------------------------")
---实现面向对象的类的继承
Person={
name,
age
}
function Person:eat()
print(self.age.."岁的"..self.name.."在吃饭")
end
--创建一个表的模板,通过使用模板达到类似构造函数的目的
--使用new方法创建新的表
function Person:new(o)
--若o为空,则t={},若o不为空,则t=o
local t = o or {} --防止外界访问到t
--t为元表,若调用属性时,该属性不存在,就在__index指向的表里面去查找
--1.
--setmetatable(t,{__index=Person})
--2.
setmetatable(t,self)
self.__index=self
return t
end
Student=Person:new()
Student.grade=1
Student.class=20
s1=Student:new({grade=4,class=3,weight=100,name="wjz",age=49})
print(s1.name,s1.age,s1.grade,s1.class,s1.weight)
s1:eat()
--s1.eat(s1)