Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Указание типа возвращаемых данных у функций (http://www.flasher.ru/forum/showthread.php?t=171006)

goodguy 07.11.2011 16:41

Цитата:

Неужели? 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 классами проблем нет, но интерфейсы - другой случай.

gloomyBrain 07.11.2011 16:44

Ну это круто конечно, только бессмысленно =)
В моем проекте я могу не знать что именно возвращает функция, но в том что она хоть что-то возвращает я не могу сомневаться. Так что сомнительная фича. Я всегда пишу Object.

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

Inet_PC 07.11.2011 16:44

Но похоже сильно разницы нет, и это всего лишь проверка при компилиции, ибо вот так работает:
Код AS3:

var o: Object = this['getStuff']();


goodguy 07.11.2011 16:50

Цитата:

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

etc 07.11.2011 16:53

goodguy, это вполне логичная ошибка приведения типов, а не вызова неопределенного метода/свойства. * по сути типа вообще никакого не имеет, поэтому и ошибки как бы нет.

goodguy 07.11.2011 17:04

О чем я и говорю. Использование звездочки != использование Object в качестве типа
В том посте не так выразился =)

etc 07.11.2011 17:17

Цитата:

Сообщение от goodguy (Сообщение 1044390)
О чем я и говорю. Использование звездочки != использование Object в качестве типа
В том посте не так выразился =)

Ну так выражайтесь, чтобы было правильно сходу.
Несмотря на подобные «фичи», их использование должно быть осознанным, а не ради подавления ворнингов и эксепшенов.

Wolsh 07.11.2011 18:40

Цитата:

var someVal:* = new ToDispose() as IDisposable;
А можно поинтересоваться, в чем задумка кастования в этой ситуации? Кто в трезвой памяти будет кастовать к одному типу для инициализации переменной другого типа или типа * ?

goodguy 07.11.2011 19:07

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

Wolsh 07.11.2011 21:11

Все равно не понял, какое отношение это имеет к данному выражению. Ну пусть в сеттере (value:*). А кастинг-то тут каким боком? Такому сеттеру же совсем по-барабану, что в него передали, зачем ему кастинг?
Ну и, не могу промолчать, но почему же не сделать хотя бы маркерный интерфейс, реализуемый и солдатами и транспортом, какой-нибудь IForce, и спать ночью спокойно, не царапая программистскую совесть звездами?


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

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