2012-02-07 2 views
1

У меня есть список объектов класса 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)) 

(я знаю, что этот пример легко переписать, как я мог бы сделать метод создания списка объектов типа А, но функция используется в другом месте, где нужны объекты типа B, и я не хотите дублировать код)

+3

Вы уверены, что имеете в виду Lisp? Ваши объявления классов ошибочны. Common Lisp не рассматривает классы как типы, которые вы думаете. В Common Lisp также нет такой вещи, как «downcasting». Общая система объектов Lisp (CLOS) работает иначе, чем объектная система на таких языках, как C++ или Java. –

+0

Я уверен, что я это делаю, но я просто разбираюсь в lisp и поэтому используется для ООП на C++/Java, если нет способа написать «функцию каста», пожалуйста, напишите об этом, и я буду рад принять это как ответ. – Sim

+0

Я надеялся, что не могу как-то сказать, что какой-то объект следует рассматривать так, как если бы он был там, где его суперклассовый тип и, следовательно, не имеет (неизученных) других членов-варов – Sim

ответ

2

Если вы абсолютно должны преобразовать экземпляры класса B в экземпляры класса A, вы можете сделать одностороннее их преобразование с использованием CHANGE-CLASS. Это необратимое изменение каждого экземпляра.

Поскольку я не уверен на 100%, что вы на самом деле хотите, лучшее предложение, которое я могу дать, это «вы попробовали оставить их как класс B и посмотреть, работает ли он?»

Скорее всего, он просто сработает, если у вас нет методов общей функции где-нибудь, которые обрабатывают экземпляры класса B иначе, чем экземпляры класса A. Если речь идет только о том, чтобы удалить пространство, которое займет дополнительный слот, у вас есть что на самом деле это стоит (возможно, это не так, если у вас нет нескольких тысяч экземпляров класса B, где вы могли бы справиться с экземплярами класса A).

+0

, но он будет работать, но будет ненужные данные, и метод печати будет печатать слишком много, так как он использует функцию CALL-NEXT-METHOD. – Sim