Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.11.2011, 16:41
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 1  
Ответить с цитированием
goodguy
Banned

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
Неужели? Object динамический.
Не спорю, но, вот тебе пример, когда со звездочкой все нормально сработает, а с Object нет (просто недавно столкнулся с этим, раньше тоже думал, что без разницы):
есть какой-либо интерфейс:
Код AS3:
package  
{
	public interface IDisposable {
		function dispose():void;
	}
 
}
класс, реализующий его

Код AS3:
package {
	import flash.display.Sprite;
	public class ToDispose extends Sprite implements IDisposable {
 
		public function ToDispose() {}
		public function dispose():void {
			trace("disposal");
		}
	}
}
Ну и, собственно сам тест:
Код AS3:
package  
{
	import flash.display.Sprite;
 
	public class ObjectTest extends Sprite
	{
 
		public function ObjectTest() {
 
			var someVal:Object = new ToDispose() as IDisposable;
			someValue	= someVal;
 
		}
		public function set someValue(value:IDisposable):void {
			value.dispose();
		}
	}
}
В этом случае компиляция завершается ошибкой
Код:
C:\Users\Konstantin\Flash\DifferentTests\src\ObjectTest.as(11): col: 16 Error: Implicit coercion of a value with static type Object to a possibly unrelated type IDisposable.
Меняем объект на звездочку, и все работает без проблем.
Код AS3:
package  
{
	import flash.display.Sprite;
 
	public class ObjectTest extends Sprite
	{
 
		public function ObjectTest() {
 
			var someVal:* = new ToDispose() as IDisposable;
			someValue	= someVal;
 
		}
		public function set someValue(value:IDisposable):void {
			value.dispose();
		}
	}
}
C классами проблем нет, но интерфейсы - другой случай.

Старый 07.11.2011, 16:44
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 2  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Ну это круто конечно, только бессмысленно =)
В моем проекте я могу не знать что именно возвращает функция, но в том что она хоть что-то возвращает я не могу сомневаться. Так что сомнительная фича. Я всегда пишу Object.

@goodguy
Так ты тип поставь нормальный - IDisposable, и все заработает =)
__________________
...вселенская грусть

Старый 07.11.2011, 23:00
strangedk вне форума Посмотреть профиль Отправить личное сообщение для strangedk Найти все сообщения от strangedk
  № 3  
Ответить с цитированием
strangedk
 
Аватар для strangedk

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
Цитата:
Сообщение от gloomyBrain Посмотреть сообщение
В моем проекте я могу не знать что именно возвращает функция
Имхо, это крайне нежелательный случай, когда Вы не знаете какой тип возвращает функция.

Если вы знаете что она может вернуть несколько типов, лучше проверить их на выходе с помощью switch-is инструкций

Добавлено через 2 минуты
Цитата:
Сообщение от goodguy Посмотреть сообщение
В общем ладно, хватит меня убеждать, что звездочка зло )
Ничего плохого в ней нет, если не злоупотреблять.
Звездочка - зло ))) я это отношу туда же, куда и обращение вида parent.parent.parent - вроде синтаксис позволяет, но использовать никому не порекомендую.

На вопрос Вы ответили верно, Object != *

Старый 07.11.2011, 16:44
Inet_PC вне форума Посмотреть профиль Отправить личное сообщение для Inet_PC Посетить домашнюю страницу Inet_PC Найти все сообщения от Inet_PC
  № 4  
Ответить с цитированием
Inet_PC
 
Аватар для Inet_PC

Регистрация: Feb 2009
Адрес: Гы...поди, найди!
Сообщений: 853
Записей в блоге: 1
Но похоже сильно разницы нет, и это всего лишь проверка при компилиции, ибо вот так работает:
Код AS3:
var o: Object = this['getStuff']();
__________________
http://www.chessmax.ru

Старый 07.11.2011, 16:50
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 5  
Ответить с цитированием
goodguy
Banned

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Цитата:
Так что сомнительная фича. Я всегда пишу Object.
В бокс2д, userData имет тип данных *, и там никак объектом не заменишь.
Допустим у меня в игре есть несколько видов солдат, Rookie, Thug, Mercenary и т.д.
Все они, применяют интерфейс ISoldier, и при столкновениях UserData проверяется по интферфейсу объекта. Согласись, проверять каждый класс было бы глупо. Да и не известно, сколько я их еще захочу добавить.
Раз уж с объектом это работать не будет, остается только звездочка.
Так что фича не сомнительная, а довольно полезная.

Старый 07.11.2011, 16:53
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 6  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
goodguy, это вполне логичная ошибка приведения типов, а не вызова неопределенного метода/свойства. * по сути типа вообще никакого не имеет, поэтому и ошибки как бы нет.

Старый 07.11.2011, 17:04
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 7  
Ответить с цитированием
goodguy
Banned

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
О чем я и говорю. Использование звездочки != использование Object в качестве типа
В том посте не так выразился =)

Старый 07.11.2011, 17:17
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 8  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от goodguy Посмотреть сообщение
О чем я и говорю. Использование звездочки != использование Object в качестве типа
В том посте не так выразился =)
Ну так выражайтесь, чтобы было правильно сходу.
Несмотря на подобные «фичи», их использование должно быть осознанным, а не ради подавления ворнингов и эксепшенов.

Старый 07.11.2011, 18:40
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 9  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
var someVal:* = new ToDispose() as IDisposable;
А можно поинтересоваться, в чем задумка кастования в этой ситуации? Кто в трезвой памяти будет кастовать к одному типу для инициализации переменной другого типа или типа * ?
__________________
Reality.getBounds(this);

Старый 07.11.2011, 19:07
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 10  
Ответить с цитированием
goodguy
Banned

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
В скайпе уже объяснял народу =) Ну да ладно, объясню еще раз.
Такая ситуация:
бокс2д, там userData имеет тип данных *. У меня в тип данных, который может быть ей назначен, передается либо ISoldier, либо IMovable. Причем не известно когда и какой будет назначаться. Назначается он не напрямую, а через сеттер. В классах солдат сеттеры в качестве параметра имеют ISoldier, в транспортных средствах IMovable. Это нужно для проверки столкновений между разными объектами через b2ContactListener.
Так вот, если я назначу туда Object, вместо *, то все мои сеттеры будут дружно кидаться ошибками прведения к типу. Да и смысла назначать туда Object не вижу, так как все равно потом придется проверять ISoldier это или IMovable.
Так что звездочка здесь - самый удобный вариант (хоть и не утверждаю, что без нее обойтись нельзя).

Создать новую тему Ответ Часовой пояс GMT +4, время: 03:38.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
void , типы данных , функции

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 03:38.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.