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 semula

Dalam Lua kita boleh menulis semula fungsi kelas asas dan mentakrifkan pelaksanaan kita sendiri dalam kelas terbitan:

rreee