2012-04-04 4 views
1

Während es im allgemeinen Fall nicht viel Sinn macht, da es über Superklassen getan werden soll, möchte ich "nil" für einen bestimmten Parameter zulassen und vermeiden, eine separate Methode definieren zu müssen.Kann in CLOS-Methodendefinitionen ein Spezialist eine Liste von Klassen und nicht eine einzelne Klasse sein?

Ich versuche, etwas wie der (Pseudo-Code) zu tun

(defmethod my-method ((obj1 my-class1) (obj2 (or my-class2 null))) 
    method-body  ) 
+1

Um viel Code-Duplikation zu vermeiden, könnten Sie entweder [1] ein Makro schreiben, das eine Reihe von Methoden schreibt, oder [2] ein Label über defmethod pattern; Behalten Sie den Methodencode innerhalb einer Beschriftungsfunktion und definieren Sie dann mehrere Methoden, die auf diese Funktion zugreifen können (eine Defmethod-Sperrung). –

Antwort

3

Dies wird nicht im Klar CLOS unterstützt.

Unterstützt werden:

  • keine Klasse -> T
  • EQL
  • eine Klasse
0

Sie könnten eine mixin Klasse ohne Schlitze schaffen und dass auf die übergeordnete Liste hinzufügen von alle Klassen von Interesse; Das macht Sinn, weil das, was Sie tun, impliziert, dass alle Klassen in Ihrer Liste einem bestimmten Typ entsprechen.

Alternativ nicht spezialisieren - schreiben Sie eine Methode, die auf eine Obermenge der interessierenden Typen anwendbar ist, aber nur auf Ihre Teilmenge wirkt. Dies kann einfacher sein, ist aber weniger sauber.

Verwandte Themen