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

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

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

Регистрация: 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
  № 22  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

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

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

Старый 07.11.2011, 16:44
Inet_PC вне форума Посмотреть профиль Отправить личное сообщение для Inet_PC Посетить домашнюю страницу Inet_PC Найти все сообщения от Inet_PC
  № 23  
Ответить с цитированием
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
  № 24  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

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

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

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

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

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

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

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

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

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

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

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

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Все равно не понял, какое отношение это имеет к данному выражению. Ну пусть в сеттере (value:*). А кастинг-то тут каким боком? Такому сеттеру же совсем по-барабану, что в него передали, зачем ему кастинг?
Ну и, не могу промолчать, но почему же не сделать хотя бы маркерный интерфейс, реализуемый и солдатами и транспортом, какой-нибудь IForce, и спать ночью спокойно, не царапая программистскую совесть звездами?
__________________
Reality.getBounds(this);

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

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

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

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


 


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


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