Lua - Berorientasi Objek
Pengantar OOP
Pemrograman Berorientasi Objek (OOP), adalah salah satu teknik pemrograman yang paling banyak digunakan yang digunakan di era modern pemrograman. Ada sejumlah bahasa pemrograman yang mendukung OOP yang meliputi,
- C++
- Java
- Objective-C
- Smalltalk
- C#
- Ruby
Fitur OOP
Class - Kelas adalah templat yang dapat diperluas untuk membuat objek, memberikan nilai awal untuk status (variabel anggota) dan implementasi perilaku.
Objects - Ini adalah turunan dari kelas dan memiliki memori terpisah yang dialokasikan untuk dirinya sendiri.
Inheritance - Ini adalah konsep dimana variabel dan fungsi dari satu kelas diwarisi oleh kelas lain.
Encapsulation- Ini adalah proses menggabungkan data dan fungsi di dalam kelas. Data dapat diakses di luar kelas dengan bantuan fungsi. Ini juga dikenal sebagai abstraksi data.
OOP di Lua
Anda dapat mengimplementasikan orientasi objek di Lua dengan bantuan tabel dan fungsi kelas pertama Lua. Dengan menempatkan fungsi dan data terkait ke dalam tabel, sebuah objek terbentuk. Pewarisan dapat diimplementasikan dengan bantuan metatable, menyediakan mekanisme pencarian untuk fungsi (metode) dan kolom yang tidak ada di objek induk.
Tabel di Lua memiliki fitur objek seperti negara dan identitas yang tidak bergantung pada nilai-nilainya. Dua objek (tabel) dengan nilai yang sama merupakan objek yang berbeda, sedangkan sebuah objek dapat memiliki nilai yang berbeda pada waktu yang berbeda, tetapi objek tersebut selalu sama. Seperti objek, tabel memiliki siklus hidup yang tidak bergantung pada siapa yang membuatnya atau di mana mereka dibuat.
Contoh Dunia Nyata
Konsep orientasi objek banyak digunakan tetapi Anda perlu memahaminya dengan jelas untuk mendapatkan keuntungan yang tepat dan maksimal.
Mari kita perhatikan contoh matematika sederhana. Kami sering menghadapi situasi di mana kami mengerjakan berbagai bentuk seperti lingkaran, persegi panjang, dan persegi.
Bentuknya bisa memiliki properti umum Area. Jadi, kita bisa memperluas bentuk lain dari bentuk objek dasar dengan luas properti umum. Masing-masing bentuk dapat memiliki sifat dan fungsinya sendiri seperti persegi panjang dapat memiliki properti panjang, lebar, luas sebagai propertinya, dan printArea serta hitunganArea sebagai fungsinya.
Membuat Kelas Sederhana
Implementasi kelas sederhana untuk persegi panjang dengan tiga area properti, panjang, dan lebarnya ditampilkan di bawah ini. Ini juga memiliki fungsi printArea untuk mencetak area yang dihitung.
-- Meta class
Rectangle = {area = 0, length = 0, breadth = 0}
-- Derived class method 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
-- Derived class method printArea
function Rectangle:printArea ()
print("The area of Rectangle is ",self.area)
end
Membuat Objek
Membuat objek adalah proses mengalokasikan memori untuk instance kelas. Setiap objek memiliki memorinya sendiri dan berbagi data kelas yang sama.
r = Rectangle:new(nil,10,20)
Mengakses Properti
Kita dapat mengakses properti di kelas menggunakan operator titik seperti yang ditunjukkan di bawah ini -
print(r.length)
Mengakses Fungsi Anggota
Anda dapat mengakses fungsi anggota menggunakan operator titik dua dengan objek seperti yang ditunjukkan di bawah ini -
r:printArea()
Memori dialokasikan dan nilai awal ditetapkan. Proses inisialisasi dapat dibandingkan dengan konstruktor dalam bahasa berorientasi objek lainnya. Ini tidak lain adalah fungsi yang memungkinkan pengaturan nilai seperti yang ditunjukkan di atas.
Contoh Lengkap
Mari kita lihat contoh lengkap menggunakan orientasi objek di Lua.
-- Meta class
Shape = {area = 0}
-- Base class method 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
-- Base class method printArea
function Shape:printArea ()
print("The area is ",self.area)
end
-- Creating an object
myshape = Shape:new(nil,10)
myshape:printArea()
Ketika Anda menjalankan program di atas, Anda akan mendapatkan output berikut.
The area is 100
Warisan di Lua
Pewarisan adalah proses memperluas objek dasar sederhana seperti bentuk menjadi persegi panjang, persegi, dan sebagainya. Ini sering digunakan di dunia nyata untuk berbagi dan memperluas properti dan fungsi dasar.
Mari kita lihat ekstensi kelas sederhana. Kami memiliki kelas seperti yang ditunjukkan di bawah ini.
-- Meta class
Shape = {area = 0}
-- Base class method 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
-- Base class method printArea
function Shape:printArea ()
print("The area is ",self.area)
end
Kita dapat memperluas bentuk menjadi kelas persegi seperti yang ditunjukkan di bawah ini.
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
Fungsi Dasar Over-riding
Kita dapat mengganti fungsi kelas dasar daripada menggunakan fungsi di kelas dasar, kelas turunan dapat memiliki implementasinya sendiri seperti yang ditunjukkan di bawah ini -
-- Derived class method printArea
function Square:printArea ()
print("The area of square is ",self.area)
end
Contoh Lengkap Warisan
Kita dapat memperluas implementasi kelas sederhana di Lua seperti yang ditunjukkan di atas dengan bantuan metode baru lainnya dengan bantuan metatables. Semua variabel anggota dan fungsi kelas dasar dipertahankan di kelas turunan.
-- Meta class
Shape = {area = 0}
-- Base class method 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
-- Base class method printArea
function Shape:printArea ()
print("The area is ",self.area)
end
-- Creating an object
myshape = Shape:new(nil,10)
myshape:printArea()
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
-- Derived class method printArea
function Square:printArea ()
print("The area of square is ",self.area)
end
-- Creating an object
mysquare = Square:new(nil,10)
mysquare:printArea()
Rectangle = Shape:new()
-- Derived class method 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
-- Derived class method printArea
function Rectangle:printArea ()
print("The area of Rectangle is ",self.area)
end
-- Creating an object
myrectangle = Rectangle:new(nil,10,20)
myrectangle:printArea()
Saat kita menjalankan program di atas, kita akan mendapatkan output berikut -
The area is 100
The area of square is 100
The area of Rectangle is 200
Dalam contoh di atas, kita telah membuat dua kelas turunan - Persegi Panjang dan Persegi dari kelas dasar Persegi. Dimungkinkan untuk mengganti fungsi kelas dasar di kelas turunan. Dalam contoh ini, kelas turunan menggantikan fungsi printArea.