Lua berorientasikan objek
Pengaturcaraan Berorientasikan Objek (OOP) ialah seni bina pengaturcaraan komputer yang sangat popular.
Bahasa pengaturcaraan berikut menyokong pengaturcaraan berorientasikan objek:
C++
Jawa
Objektif-C
Smalltalk
C#
Ruby
Ciri berorientasikan objek
1) Enkapsulasi: merujuk kepada keupayaan untuk merangkum entiti maklumat, fungsi, Atribut Respons dimuatkan ke dalam objek yang berasingan.
2) Warisan: Kaedah pewarisan membolehkan atur cara asal dikembangkan tanpa mengubahnya, supaya fungsi asal dapat dikekalkan dan fungsi baharu boleh dikembangkan. Ini membantu mengurangkan pengekodan berulang dan meningkatkan kecekapan pembangunan perisian.
3) Polimorfisme: Operasi yang sama bertindak pada objek yang berbeza dan boleh mempunyai tafsiran yang berbeza dan menghasilkan hasil pelaksanaan yang berbeza. Pada masa jalanan, anda boleh memanggil kaedah dalam kelas terbitan melalui penuding ke kelas asas.
4) Abstraksi: Abstraksi ialah cara untuk memudahkan masalah kehidupan sebenar yang kompleks. Ia boleh mencari definisi kelas yang paling sesuai untuk masalah tertentu dan boleh menjelaskannya pada tahap pewarisan yang paling sesuai. soalan.
Berorientasikan objek dalam Lua
Kita tahu bahawa objek terdiri daripada sifat dan kaedah. Struktur paling asas dalam LUA ialah jadual, jadi jadual perlu digunakan untuk menerangkan sifat objek.
Fungsi dalam Lua boleh digunakan untuk mewakili kaedah. Kemudian kelas dalam LUA boleh disimulasikan melalui fungsi jadual +.
Bagi pewarisan, ia boleh disimulasikan melalui metetable (tidak disyorkan, hanya mensimulasikan objek paling asas sahaja sudah mencukupi pada kebanyakan masa).
Jadual dalam Lua bukan sahaja objek dalam erti kata tertentu. Seperti objek, jadual juga mempunyai keadaan (pembolehubah ahli); ia juga mempunyai sifat bebas daripada nilai objek juga mempunyai nilai yang berbeza pada masa yang berbeza, tetapi ia sentiasa menjadi objek, kitaran hayat jadual tidak ada kaitan dengan apa ia dicipta dan dari mana ia dicipta. Objek mempunyai fungsi ahlinya, dan jadual juga mempunyai:
Account = {balance = 0} function Account.withdraw (v) Account.balance = Account.balance - v end
Takrifan ini mencipta fungsi baharu dan menyimpannya dalam medan tarik balik objek Akaun Di bawah kita boleh memanggilnya seperti ini:
Account.withdraw(100.00)
Contoh mudah
Kelas ringkas berikut mengandungi tiga atribut: luas, panjang dan lebar Kaedah printArea digunakan untuk mencetak hasil pengiraan:
-- Meta class Rectangle = {area = 0, length = 0, breadth = 0} -- 派生类的方法 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 -- 派生类的方法 printArea function Rectangle:printArea () print("矩形面积为 ",self.area) end
Buat objek
. Cipta objek ialah Proses memperuntukkan memori untuk contoh kelas. Setiap kelas mempunyai ingatan sendiri dan berkongsi data biasa.
r = Rectangle:new(nil,10,20)
Atribut akses
Kita boleh menggunakan noktah (.) untuk mengakses atribut kelas:
print(r.length)
Akses fungsi ahli
Kita boleh gunakan titik bertindih ( :) untuk mengakses sifat kelas:
r:printArea()
Memori diperuntukkan apabila objek dimulakan.
Contoh lengkap
Di bawah ini kami menunjukkan contoh lengkap berorientasikan objek Lua:
-- Meta class Shape = {area = 0} -- 基础类方法 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 -- 基础类方法 printArea function Shape:printArea () print("面积为 ",self.area) end -- 创建对象 myshape = Shape:new(nil,10) myshape:printArea()
Laksanakan atur cara di atas, hasil output ialah:
面积为 100
Warisan Lua
Warisan bermaksud satu objek secara langsung menggunakan sifat dan kaedah objek lain. Sifat dan kaedah yang boleh digunakan untuk melanjutkan kelas asas.
Yang berikut menunjukkan contoh pewarisan mudah:
-- Meta class Shape = {area = 0} -- 基础类方法 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 -- 基础类方法 printArea function Shape:printArea () print("面积为 ",self.area) end
Contoh berikut, objek Square mewarisi kelas Shape:
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
Contoh lengkap
The Contoh berikut: Kami mewarisi kelas mudah untuk melanjutkan kaedah kelas terbitan Kelas terbitan mengekalkan pembolehubah ahli dan kaedah kelas yang diwarisi:
-- Meta class Shape = {area = 0} -- 基础类方法 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 -- 基础类方法 printArea function Shape:printArea () print("面积为 ",self.area) end -- 创建对象 myshape = Shape:new(nil,10) myshape:printArea() Square = Shape:new() -- 派生类方法 new function Square:new (o,side) o = o or Shape:new(o,side) setmetatable(o, self) self.__index = self return o end -- 派生类方法 printArea function Square:printArea () print("正方形面积为 ",self.area) end -- 创建对象 mysquare = Square:new(nil,10) mysquare:printArea() Rectangle = Shape:new() -- 派生类方法 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 -- 派生类方法 printArea function Rectangle:printArea () print("矩形面积为 ",self.area) end -- 创建对象 myrectangle = Rectangle:new(nil,10,20) myrectangle:printArea()
Jalankan kod di atas, dan hasil output ialah: <. 🎜>
面积为 100 正方形面积为 100 矩形面积为 200
Fungsi menulis semulaDalam Lua kita boleh menulis semula fungsi kelas asas dan mentakrifkan pelaksanaan kita sendiri dalam kelas terbitan:
rreee