|
|
|||||
Регистрация: Mar 2010
Сообщений: 137
|
Проблема с typeOf()
Есть вот такой вот метод:
public function getByType(childType:IObj):IObj { for each(var tmpEl:IObj in _objList) { if(typeof(tmpEl) == typeof(childType)) { return tmpEl; } } return null; } Таким образом пользователь сможет пихать любого наследника в список, после чего получать его по типу без необходимости знать точный индекс нужного наследника. Простой проверкой вышло, что через typeOf() работать нельзя - он возвращает тип самой ссылки, а не конкретного объекта, на который ссылается и, понятное дело, цикл метода вылетал на первой итерации. Вопрос, собственно... Как вы предложите решить эту проблему? Пока идея такая: Ввести в интерфейс IObj метод getType(), реализация которого обязана будет вернуть тип - можно в строковом виде, но я думаю взять константу, которая будет храниться в статическом классе. В результате вместо typeOf() будем вызывать этот метод и сравнивать элементы через него. Идея достаточно громоздкая и мне кажется, что можно найти более изящное решение. Если будет возможность - предложите свои соображения по этому поводу. |
|
|||||
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
Оператор is в помощь. И typeof - это оператор, а не функция.
|
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
__________________
Загружаем картинки, минуя ошибки безопасности |
|
|||||
Регистрация: Mar 2010
Сообщений: 137
|
А как это здесь поможет? Мы же передаём объект, а не тип.
Насчёт typeof - согласен. Был не прав. Цитата:
Проблема такого сопособа в том, что подобная фишка прокатит только в AS3. Вещь, которую пишу сейчас, хочется со временем портировать на С++. |
|
|||||
Добавить в интерфейс геттер definition, который будет возвращать класс объекта. В обертке объявить словарь в котором будут храниться ассоциации итемов с классом.
В обертке private var _classMap:Dictionary = new Dictionary(); public function addItem(value:IObj):void { ... /* Добавляем элемент или массив / вектор элементов * если предполагается возвращать несколько элементов */ _classMap[value.definition] = value; } public function getByType(child:IObj):IObj { return _classMap[child.definition]; }
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
Et cetera
Регистрация: Sep 2002
Сообщений: 30,784
|
alatar, чего-то я вашего кунг-фу не осилил.
|
|
|||||
Да нет там никакого кунг-фу, просто экземпляр принудительно возвращает свой класс.
__________________
משיח לא בא משיח גם לא מטלפן Последний раз редактировалось alatar; 13.06.2011 в 00:09. |
|
|||||
Регистрация: Mar 2010
Сообщений: 137
|
Цитата:
Спасибо, alatar, за ответ. Добавлено через 3 минуты (Прочитал новое сообщение) Ааа... Вот как. А так можно? Возвращать в качестве результата класс, а не ссылку на его экземпляр? Последний раз редактировалось semenyakinVS; 13.06.2011 в 00:12. Причина: запятую поставил |
|
|||||
стервочка (я мужик)
|
|
Часовой пояс GMT +4, время: 22:13. |
|
« Предыдущая тема | Следующая тема » |
Теги |
typeof , абстракция , полиморфизм , тип |
|
|