LISP - ĐÓNG CỬA
LISP thông thường có trước sự phát triển của lập trình hướng đối tượng vài thập kỷ. Tuy nhiên, hướng đối tượng đã được kết hợp vào nó ở giai đoạn sau.
Xác định các lớp
Các defclassmacro cho phép tạo các lớp do người dùng định nghĩa. Nó thiết lập một lớp như một kiểu dữ liệu. Nó có cú pháp sau:
(defclass class-name (superclass-name*)
(slot-description*)
class-option*))
Vị trí là các biến lưu trữ dữ liệu hoặc các trường.
Mô tả vị trí có dạng (vị trí-tên vị trí-tùy chọn *), trong đó mỗi tùy chọn là một từ khóa theo sau là tên, biểu thức và các tùy chọn khác. Các tùy chọn vị trí thường được sử dụng nhất là -
:accessor Tên chức năng
:initform biểu hiện
:initarg Biểu tượng
Ví dụ, chúng ta hãy xác định một lớp Box, với ba vị trí chiều dài, chiều rộng và chiều cao.
(defclass Box ()
(length
breadth
height)
)
Cung cấp quyền kiểm soát truy cập và đọc / ghi cho một vị trí
Trừ khi các khe cắm có các giá trị có thể được truy cập, đọc hoặc ghi vào, các lớp khá vô dụng.
Bạn có thể chỉ định accessorscho mỗi vị trí khi bạn xác định một lớp. Ví dụ, tham gia lớp Box của chúng tôi -
(defclass Box ()
((length :accessor length)
(breadth :accessor breadth)
(height :accessor height)
)
)
Bạn cũng có thể chỉ định riêng accessor tên để đọc và viết một chỗ trống.
(defclass Box ()
((length :reader get-length :writer set-length)
(breadth :reader get-breadth :writer set-breadth)
(height :reader get-height :writer set-height)
)
)
Tạo phiên bản của một lớp
Hàm chung make-instance tạo và trả về một thể hiện mới của một lớp.
Nó có cú pháp sau:
(make-instance class {initarg value}*)
Thí dụ
Hãy để chúng tôi tạo một lớp Hộp, với ba khe, chiều dài, chiều rộng và chiều cao. Chúng tôi sẽ sử dụng ba bộ truy cập vị trí để đặt giá trị trong các trường này.
Tạo một tệp mã nguồn mới có tên main.lisp và nhập mã sau vào đó.
(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))
Khi bạn thực thi mã, nó trả về kết quả sau:
Length of the Box is 10
Breadth of the Box is 10
Height of the Box is 5
Định nghĩa một phương pháp lớp
Các defmethodmacro cho phép bạn xác định một phương thức bên trong lớp. Ví dụ sau mở rộng lớp Box của chúng ta để bao gồm một phương thức có tên là volume.
Tạo một tệp mã nguồn mới có tên main.lisp và nhập mã sau vào đó.
(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))
Khi bạn thực thi mã, nó trả về kết quả sau:
Length of the Box is 10
Breadth of the Box is 10
Height of the Box is 5
Volume of the Box is 500
Di sản
LISP cho phép bạn xác định một đối tượng dưới dạng đối tượng khác. Đây được gọi làinheritance.Bạn có thể tạo một lớp dẫn xuất bằng cách thêm các tính năng mới hoặc khác. Lớp dẫn xuất kế thừa các chức năng của lớp cha.
Ví dụ sau giải thích điều này -
Thí dụ
Tạo một tệp mã nguồn mới có tên main.lisp và nhập mã sau vào đó.
(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))
Khi bạn thực thi mã, nó trả về kết quả sau:
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