Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 如何在不使用函数的情况下向下转换对象列表_Oop_Common Lisp - Fatal编程技术网

Oop 如何在不使用函数的情况下向下转换对象列表

Oop 如何在不使用函数的情况下向下转换对象列表,oop,common-lisp,Oop,Common Lisp,我得到了类类型B(B从a继承)的对象列表。 如何将所有B对象向下转换为A对象,而不使用函数提取所需信息并创建新实例 (defclass A () ( (varI :initarg :varI :accessor varI) ) ) (defclass B (A) ( (varII :initarg :varII :accessor varII) ) ) (defun generate-list-of-type-B-objects () (....does...some..stuff....)

我得到了类类型B(B从a继承)的对象列表。 如何将所有B对象向下转换为A对象,而不使用函数提取所需信息并创建新实例

(defclass A () ( (varI :initarg :varI :accessor varI) ) )

(defclass B (A) ( (varII :initarg :varII :accessor varII) ) )

(defun generate-list-of-type-B-objects () (....does...some..stuff....))

(defvar *listoftypeA* (generate-list-of-type-B-objects) )

(我知道这个例子很容易重写,因为我可以让这个方法生成类型a对象的列表,但是这个函数在其他需要类型B对象的地方使用,我不想重复代码)

如果你绝对必须将类B的实例转换成类a的实例,您可以使用进行单向转换。这是每个实例的不可逆变化

因为我不是100%确定你到底想要什么,所以我能给你的最好建议是“你有没有试过把他们列为B类,看看是否有效?”


很有可能它会正常工作,除非你在某个地方有一个泛型函数的方法,它对类B的实例的处理与对类a的实例的处理不同。如果只是为了减少额外的插槽所占用的空间,你是否衡量过它是否值得(可能不是这样,除非您有数千个B类实例,您可以通过A类实例来处理).

你确定你说的是Lisp吗?你的类声明是错误的。Common Lisp不像你想的那样将类视为类型。Common Lisp中也没有“向下转换”之类的东西。Common Lisp对象系统(CLOS)与C++、java等语言中的对象系统不同,我确信我是这样做的,但是我只是学习LISP,因此,如果没有写一个“铸造函数”,就可以用在C++的/java类型的OOP中。请发布它,我很乐意接受它作为答案。我希望Being能够以某种方式说,某个对象应该被视为它的超类类型,因此没有(未指定的)其他成员认为它可以工作,但是会有不必要的数据,并且打印方法会打印太多,因为它使用了CALL-NEXT-method特性。