LISP - KAPAT

Ortak LISP, nesne yönelimli programlamanın ilerlemesinden birkaç on yıl önceydi. Bununla birlikte, nesne yönelimi daha sonraki bir aşamada buna dahil edildi.

Sınıfları Tanımlama

defclassmakrosu, kullanıcı tanımlı sınıflar oluşturmaya izin verir. Veri türü olarak bir sınıf oluşturur. Aşağıdaki sözdizimine sahiptir -

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

Yuvalar, verileri veya alanları depolayan değişkenlerdir.

Alan açıklaması, her seçeneğin bir anahtar sözcük ve ardından bir ad, ifade ve diğer seçenekler olduğu bir biçime (yuva adı yuva seçeneği *) sahiptir. En sık kullanılan yuva seçenekleri şunlardır:

  • :accessor fonksiyon adı

  • :initform ifade

  • :initarg sembol

Örneğin, üç yuva uzunluğu, genişliği ve yüksekliği olan bir Box sınıfı tanımlayalım.

(defclass Box () 
   (length 
   breadth 
   height)
)

Bir Yuvaya Erişim ve Okuma / Yazma Denetimi Sağlama

Yuvaların erişilebilen, okunabilen veya yazılabilen değerleri olmadıkça, sınıflar oldukça kullanışsızdır.

Belirtebilirsiniz accessorsbir sınıf tanımladığınızda her alan için. Örneğin, Box sınıfımızı ele alalım -

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

Ayrı olarak da belirtebilirsiniz accessor bir yuvayı okumak ve yazmak için isimler.

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

Bir Sınıfın Örneğini Oluşturma

Genel işlev make-instance bir sınıfın yeni bir örneğini oluşturur ve döndürür.

Aşağıdaki sözdizimine sahiptir -

(make-instance class {initarg value}*)

Misal

Üç yuva, uzunluk, genişlik ve yüksekliğe sahip bir Box sınıfı oluşturalım. Bu alanlardaki değerleri ayarlamak için üç yuva erişimcisi kullanacağız.

Main.lisp adlı yeni bir kaynak kod dosyası oluşturun ve içine aşağıdaki kodu yazın.

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

Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -

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

Bir Sınıf Yöntemi Tanımlama

defmethodmakrosu, sınıf içinde bir yöntem tanımlamanıza izin verir. Aşağıdaki örnek, Box sınıfımızı volume adında bir yöntemi içerecek şekilde genişletir.

Main.lisp adlı yeni bir kaynak kod dosyası oluşturun ve içine aşağıdaki kodu yazın.

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

Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -

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

Miras

LISP, bir nesneyi başka bir nesne açısından tanımlamanıza izin verir. Bu denirinheritance.Yeni veya farklı özellikler ekleyerek türetilmiş bir sınıf oluşturabilirsiniz. Türetilmiş sınıf, üst sınıfın işlevlerini miras alır.

Aşağıdaki örnek bunu açıklıyor -

Misal

Main.lisp adlı yeni bir kaynak kod dosyası oluşturun ve içine aşağıdaki kodu yazın.

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

Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -

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