Lua实现简单的类,继承,多态 实例

 1 -- 类的例子,长方形的类,具备一个打印面积方法和一个设置长宽的方法
 2 --lua实现类的思路,定义出来的对象在lua中可以访问自己有的成员,访问成员函数实际上是通过元表的__index方法实现的,具体点就是访问自己的成员函数,发现没有函数,然后判断是否有元表和__index元方法(当然都有,而且是必须有),然后就变成了访问元表也就是类的成员,自然就访问了成员函数
 3 Cfx = { m_chang = 0, m_kuan = 0, m_area = 0 }
 4 Cfx.__index = Cfx
 5 function Cfx:new(chang, kuan)
 6     local self = { }
 7     setmetatable(self, Cfx)
 8     self.m_chang = chang
 9     self.m_kuan = kuan
10     self.m_area = chang * kuan
11     return self
12 end
13 
14 function Cfx:printArea()
15     print("长方形的面积为:" .. self.m_area)
16 end
17 
18 function Cfx:setC(chang, kuan)
19     if chang then
20         self.m_chang = chang
21     end
22     if kuan then
23         self.m_kuan = kuan
24     end
25     self.m_area = self.m_chang * self.m_kuan
26 end
27 
28 r1 = Cfx:new(10, 20)
29 r1:printArea()
30 r2 = Cfx:new(30, 40)
31 r2:printArea()
32 r1:setC(_, 50)
33 r2:setC(50)
34 print("----------------------------------------------------------------")
35 r1:printArea()
36 r2:printArea()
37 
38 
39 
40 --Lua实现继承,继承自上面的长方形类,同时具备自身的成员(周长)和一个打印周长的方法
41 --继承也是跟上面所说的类的构建同理,可以看成是C++中的先构造一个父类,然后再构造自己,所以可以理解为有两个类构造出来了
42 Cfx_w ={m_zhouchang=0}
43 Cfx_w.__index=Cfx_w
44 setmetatable(Cfx_w,Cfx)
45 
46 function Cfx_w:new(c,k)
47 local self ={}
48  self=Cfx:new(c,k)
49  setmetatable(self ,Cfx_w)
50  self.m_zhouchang=2*(c+k)
51  return self
52 end
53 
54 
55   function Cfx_w:printZ()
56   self.m_zhouchang=2*(self.m_chang+self.m_kuan)
57     print ("长方形的周长为:" .. self.m_zhouchang)
58     end
59 
60 function Cfx_w:printArea()
61 print ("重写父类方法,长方形面积是:".. self.m_area)
62 end
63 r3=Cfx_w:new(10,5)
64 r3:printArea()
65 r3:printZ()
66 print ("****************************************************************")
67 r3:setC(2,2)
68 r3:printArea()
69 r3:printZ()
View Code

      

      lua实现类的思路,定义出来的对象在lua中可以访问自己有的成员,访问成员函数实际上是通过元表的__index方法实现的,具体点就是访问自己的成员函数,发现没有函数,然后判断是否有元表和__index元方法(当然都有,而且是必须有),然后就变成了访问元表也就是类的成员,自然就访问了成员函数。

猜你喜欢

转载自www.cnblogs.com/shan-mu/p/11334738.html