LISP - ปิด

LISP ทั่วไปมีความก้าวหน้าของการเขียนโปรแกรมเชิงวัตถุเมื่อสองสามทศวรรษ อย่างไรก็ตามการวางแนววัตถุได้ถูกรวมเข้าไว้ในขั้นตอนต่อมา

การกำหนดคลาส

defclassมาโครอนุญาตให้สร้างคลาสที่ผู้ใช้กำหนดเอง สร้างคลาสเป็นชนิดข้อมูล มีไวยากรณ์ต่อไปนี้ -

(defclass class-name (superclass-name*)
   (slot-description*)
   class-option*))

สล็อตคือตัวแปรที่เก็บข้อมูลหรือฟิลด์

คำอธิบายช่องมีรูปแบบ (slot-name slot-option *) โดยที่แต่ละตัวเลือกคือคำสำคัญตามด้วยชื่อนิพจน์และตัวเลือกอื่น ๆ ตัวเลือกสล็อตที่ใช้บ่อยที่สุดคือ -

  • :accessor ฟังก์ชันชื่อ

  • :initform นิพจน์

  • :initarg สัญลักษณ์

ตัวอย่างเช่นให้เรากำหนดคลาส Box โดยมีความยาวสล็อตความกว้างและความสูงสามช่อง

(defclass Box () 
   (length 
   breadth 
   height)
)

ให้การควบคุมการเข้าถึงและอ่าน / เขียนไปยังสล็อต

เว้นแต่ว่าสล็อตจะมีค่าที่สามารถเข้าถึงอ่านหรือเขียนได้คลาสก็ค่อนข้างไร้ประโยชน์

คุณสามารถระบุ accessorsสำหรับแต่ละช่องเมื่อคุณกำหนดคลาส ตัวอย่างเช่นเข้าคลาส Box ของเรา -

(defclass Box ()
   ((length :accessor length)
      (breadth :accessor breadth)
      (height :accessor height)
   )
)

คุณยังสามารถระบุแยกต่างหาก accessor ชื่อสำหรับการอ่านและเขียนช่อง

(defclass Box ()
   ((length :reader get-length :writer set-length)
      (breadth :reader get-breadth :writer set-breadth)
      (height :reader get-height :writer set-height)
   )
)

การสร้างอินสแตนซ์ของคลาส

ฟังก์ชันทั่วไป make-instance สร้างและส่งคืนอินสแตนซ์ใหม่ของคลาส

มีไวยากรณ์ต่อไปนี้ -

(make-instance class {initarg value}*)

ตัวอย่าง

ให้เราสร้างคลาส Box โดยมีช่องสามช่องความยาวความกว้างและความสูง เราจะใช้ตัวเข้าถึงสล็อตสามตัวเพื่อตั้งค่าในฟิลด์เหล่านี้

สร้างไฟล์ซอร์สโค้ดใหม่ชื่อ main.lisp และพิมพ์รหัสต่อไปนี้

(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))

เมื่อคุณรันโค้ดจะส่งคืนผลลัพธ์ต่อไปนี้ -

Length of the Box is 10
Breadth of the Box is 10
Height of the Box is 5

การกำหนดวิธีการคลาส

defmethodมาโครช่วยให้คุณกำหนดวิธีการภายในคลาสได้ ตัวอย่างต่อไปนี้ขยายคลาส Box ของเราเพื่อรวมเมธอดที่มีชื่อว่า volume

สร้างไฟล์ซอร์สโค้ดใหม่ชื่อ main.lisp และพิมพ์รหัสต่อไปนี้

(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))

เมื่อคุณรันโค้ดจะส่งคืนผลลัพธ์ต่อไปนี้ -

Length of the Box is 10
Breadth of the Box is 10
Height of the Box is 5
Volume of the Box is 500

มรดก

LISP อนุญาตให้คุณกำหนดวัตถุในรูปแบบของวัตถุอื่น นี้เรียกว่าinheritance.คุณสามารถสร้างคลาสที่ได้รับมาโดยการเพิ่มคุณสมบัติที่ใหม่หรือแตกต่างกัน คลาสที่ได้รับสืบทอดฟังก์ชันของคลาสแม่

ตัวอย่างต่อไปนี้อธิบายสิ่งนี้ -

ตัวอย่าง

สร้างไฟล์ซอร์สโค้ดใหม่ชื่อ main.lisp และพิมพ์รหัสต่อไปนี้

(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))

เมื่อคุณรันโค้ดจะส่งคืนผลลัพธ์ต่อไปนี้ -

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