LISP - TUTUP
LISP umum mendahului kemajuan pemrograman berorientasi objek selama beberapa dekade. Namun, orientasi objek telah dimasukkan ke dalamnya pada tahap selanjutnya.
Mendefinisikan Kelas
Itu defclassmakro memungkinkan pembuatan kelas yang ditentukan pengguna. Ini menetapkan kelas sebagai tipe data. Ini memiliki sintaks berikut -
(defclass class-name (superclass-name*)
(slot-description*)
class-option*))
Slot adalah variabel yang menyimpan data, atau bidang.
Deskripsi slot memiliki bentuk (slot-name slot-option *), di mana setiap opsi adalah kata kunci yang diikuti dengan nama, ekspresi, dan opsi lainnya. Opsi slot yang paling umum digunakan adalah -
:accessor nama-fungsi
:initform ekspresi
:initarg simbol
Sebagai contoh, mari kita tentukan kelas Box, dengan tiga slot panjang, lebar, dan tinggi.
(defclass Box ()
(length
breadth
height)
)
Menyediakan Akses dan Kontrol Baca / Tulis ke Slot
Kecuali jika slot memiliki nilai yang dapat diakses, dibaca atau ditulis, kelas akan sangat tidak berguna.
Anda bisa menentukan accessorsuntuk setiap slot saat Anda menentukan kelas. Misalnya, ambil kelas Box kami -
(defclass Box ()
((length :accessor length)
(breadth :accessor breadth)
(height :accessor height)
)
)
Anda juga dapat menentukan secara terpisah accessor nama untuk membaca dan menulis slot.
(defclass Box ()
((length :reader get-length :writer set-length)
(breadth :reader get-breadth :writer set-breadth)
(height :reader get-height :writer set-height)
)
)
Membuat Instance dari Kelas
Fungsi generik make-instance membuat dan mengembalikan instance baru dari kelas.
Ini memiliki sintaks berikut -
(make-instance class {initarg value}*)
Contoh
Mari kita buat kelas Box, dengan tiga slot, panjang, lebar dan tinggi. Kami akan menggunakan tiga aksesor slot untuk mengatur nilai di bidang ini.
Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.
(defclass box ()
((length :accessor box-length)
(breadth :accessor box-breadth)
(height :accessor box-height)
)
)
(setf item (make-instance 'box))
(setf (box-length item) 10)
(setf (box-breadth item) 10)
(setf (box-height item) 5)
(format t "Length of the Box is ~d~%" (box-length item))
(format t "Breadth of the Box is ~d~%" (box-breadth item))
(format t "Height of the Box is ~d~%" (box-height item))
Saat Anda menjalankan kode, ia mengembalikan hasil berikut -
Length of the Box is 10
Breadth of the Box is 10
Height of the Box is 5
Mendefinisikan Metode Kelas
Itu defmethodmakro memungkinkan Anda untuk menentukan metode di dalam kelas. Contoh berikut memperluas kelas Box kami untuk menyertakan metode bernama volume.
Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.
(defclass box ()
((length :accessor box-length)
(breadth :accessor box-breadth)
(height :accessor box-height)
(volume :reader volume)
)
)
; method calculating volume
(defmethod volume ((object box))
(* (box-length object) (box-breadth object)(box-height object))
)
;setting the values
(setf item (make-instance 'box))
(setf (box-length item) 10)
(setf (box-breadth item) 10)
(setf (box-height item) 5)
; displaying values
(format t "Length of the Box is ~d~%" (box-length item))
(format t "Breadth of the Box is ~d~%" (box-breadth item))
(format t "Height of the Box is ~d~%" (box-height item))
(format t "Volume of the Box is ~d~%" (volume item))
Saat Anda menjalankan kode, ia mengembalikan hasil berikut -
Length of the Box is 10
Breadth of the Box is 10
Height of the Box is 5
Volume of the Box is 500
Warisan
LISP memungkinkan Anda untuk mendefinisikan suatu objek dalam kaitannya dengan objek lain. Ini disebutinheritance.Anda dapat membuat kelas turunan dengan menambahkan fitur yang baru atau berbeda. Kelas turunan mewarisi fungsionalitas dari kelas induk.
Contoh berikut menjelaskan ini -
Contoh
Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.
(defclass box ()
((length :accessor box-length)
(breadth :accessor box-breadth)
(height :accessor box-height)
(volume :reader volume)
)
)
; method calculating volume
(defmethod volume ((object box))
(* (box-length object) (box-breadth object)(box-height object))
)
;wooden-box class inherits the box class
(defclass wooden-box (box)
((price :accessor box-price)))
;setting the values
(setf item (make-instance 'wooden-box))
(setf (box-length item) 10)
(setf (box-breadth item) 10)
(setf (box-height item) 5)
(setf (box-price item) 1000)
; displaying values
(format t "Length of the Wooden Box is ~d~%" (box-length item))
(format t "Breadth of the Wooden Box is ~d~%" (box-breadth item))
(format t "Height of the Wooden Box is ~d~%" (box-height item))
(format t "Volume of the Wooden Box is ~d~%" (volume item))
(format t "Price of the Wooden Box is ~d~%" (box-price item))
Saat Anda menjalankan kode, ia mengembalikan hasil berikut -
Length of the Wooden Box is 10
Breadth of the Wooden Box is 10
Height of the Wooden Box is 5
Volume of the Wooden Box is 500
Price of the Wooden Box is 1000