![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Banned
Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Цитата:
есть какой-либо интерфейс: класс, реализующий его package { import flash.display.Sprite; public class ToDispose extends Sprite implements IDisposable { public function ToDispose() {} public function dispose():void { trace("disposal"); } } } 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. C классами проблем нет, но интерфейсы - другой случай. |
|
|||||
|
Ну это круто конечно, только бессмысленно =)
В моем проекте я могу не знать что именно возвращает функция, но в том что она хоть что-то возвращает я не могу сомневаться. Так что сомнительная фича. Я всегда пишу Object. @goodguy Так ты тип поставь нормальный - IDisposable, и все заработает =)
__________________
...вселенская грусть |
|
|||||
|
Имхо, это крайне нежелательный случай, когда Вы не знаете какой тип возвращает функция.
Если вы знаете что она может вернуть несколько типов, лучше проверить их на выходе с помощью switch-is инструкций Добавлено через 2 минуты Цитата:
На вопрос Вы ответили верно, Object != * |
|
|||||
|
Но похоже сильно разницы нет, и это всего лишь проверка при компилиции, ибо вот так работает:
__________________
http://www.chessmax.ru |
|
|||||
|
Banned
Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Цитата:
Допустим у меня в игре есть несколько видов солдат, Rookie, Thug, Mercenary и т.д. Все они, применяют интерфейс ISoldier, и при столкновениях UserData проверяется по интферфейсу объекта. Согласись, проверять каждый класс было бы глупо. Да и не известно, сколько я их еще захочу добавить. Раз уж с объектом это работать не будет, остается только звездочка. Так что фича не сомнительная, а довольно полезная. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
goodguy, это вполне логичная ошибка приведения типов, а не вызова неопределенного метода/свойства. * по сути типа вообще никакого не имеет, поэтому и ошибки как бы нет.
|
|
|||||
|
Banned
Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
О чем я и говорю. Использование звездочки != использование Object в качестве типа
В том посте не так выразился =) |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Цитата:
Несмотря на подобные «фичи», их использование должно быть осознанным, а не ради подавления ворнингов и эксепшенов. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
__________________
Reality.getBounds(this); |
|
|||||
|
Banned
Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
В скайпе уже объяснял народу =) Ну да ладно, объясню еще раз.
Такая ситуация: бокс2д, там userData имеет тип данных *. У меня в тип данных, который может быть ей назначен, передается либо ISoldier, либо IMovable. Причем не известно когда и какой будет назначаться. Назначается он не напрямую, а через сеттер. В классах солдат сеттеры в качестве параметра имеют ISoldier, в транспортных средствах IMovable. Это нужно для проверки столкновений между разными объектами через b2ContactListener. Так вот, если я назначу туда Object, вместо *, то все мои сеттеры будут дружно кидаться ошибками прведения к типу. Да и смысла назначать туда Object не вижу, так как все равно потом придется проверять ISoldier это или IMovable. Так что звездочка здесь - самый удобный вариант (хоть и не утверждаю, что без нее обойтись нельзя). |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:38. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| void , типы данных , функции |
|
|