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

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

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

Регистрация: Jul 2009
Сообщений: 77
По умолчанию приведение типов (не получается)

не понимаю почему не удаётся привести тип объекта к нужному. Код ниже, MainClass - основной.
Код AS3:
package {
	import flash.display.*;
 
	public class MainClass extends Sprite {
		private var zzz:Sprite;
 
		public function MainClass() {
			zzz = new TestClass();
			TestClass(zzz);
			zzz.myMethod();
			addChild(zzz);
		}
	}
}
Код AS3:
package {
	import flash.display.*;
 
	public class TestClass extends Sprite {
		private var whiteBack:Shape;
 
		public function TestClass() {
			whiteBack = new Shape();
			whiteBack.graphics.beginFill(0x999999, 1);
			whiteBack.graphics.drawRect(0, 0, 150, 100);
			addChild(whiteBack);
		}
		public function myMethod() {
			whiteBack.x+=10;
		}
	}
}
выходит ошибка: "Call to a possibly undefined method myMethod through a reference with static type flash.display:Sprite."

в моём понимании zzz сначала Sprite, потом TestClass(zzz) - приводит zzz к типу TestClass и нам становятся доступны все методы этого класса. Но методы не доступны, почему?
И почему пишут, что zzz ещё Sprite, разве он уже не TestClass?

если мы заменим строку zzz.myMethod(); на if (zzz is TestClass){zzz.myMethod();}
выходит та же ошибка, получается zzz имеет уже тип TestClass, но методы этого класса вызвать не может. Как же так?


Последний раз редактировалось filepark; 28.09.2010 в 06:20.
Старый 28.09.2010, 07:58
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 2  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Код AS3:
package {
    import flash.display.*;
 
    public class MainClass extends Sprite {
        private var zzz:TestClass; //вот
 
        public function MainClass() {
            zzz = new TestClass();
            TestClass(zzz); // это вообще непонятно зачем - результат куда?
            zzz.myMethod(); // была ошибка, т.к. в спрайте нет метода
            addChild(zzz);
        }
    }
}
или
Код AS3:
package {
	import flash.display.*;
 
	public class MainClass extends Sprite {
		private var zzz:Sprite;
 
		public function MainClass() {
			zzz = new TestClass();
			(zzz as TestClass).myMethod();
			addChild(zzz);
		}
	}
}
__________________
Отряд Котовскага

Старый 28.09.2010, 08:09
filepark вне форума Посмотреть профиль Отправить личное сообщение для filepark Найти все сообщения от filepark
  № 3  
Ответить с цитированием
filepark

Регистрация: Jul 2009
Сообщений: 77
понятно, что если бы самого начала zzz был TestClass, всё было бы ок. Но он сначала Спрайт, а потом должен стать TestClass. Каждый раз писать (zzz as TestClass) тоже не дело. Мне нужно чтобы переменная сменила свой тип раз и навсегда. Я и пытался это сделать - TestClass(zzz); У меня несколько классов:TestClass1, TestClass2, TestClass3 ... и объектом какого класса станет zzz заранее незвестно.

открыв Мука на стр.191 мы увидим:
var meal:Food = new Apple();
Apple(meal);
теперь типом meal стал Apple, я лишь повторил


Последний раз редактировалось filepark; 28.09.2010 в 10:05.
Старый 28.09.2010, 08:28
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 4  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Код AS3:
zzz1 = zzz as TestClass;
zzz1.myMethod();
__________________
тут я

Старый 28.09.2010, 10:02
filepark вне форума Посмотреть профиль Отправить личное сообщение для filepark Найти все сообщения от filepark
  № 5  
Ответить с цитированием
filepark

Регистрация: Jul 2009
Сообщений: 77
но в этом случае всё равно придётся объявлять тип переменной zzz1 заранее.

Вопрос 1: может ли переменная сменить свой тип?
Вопрос 2: как понимать цитату из книги (Мук на стр.191)?

Старый 28.09.2010, 10:17
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 6  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
1. Нет. Может только принять расширенный тип.

2. Мук не прав. Либо вы вырвали из контекста. Под рукой нет книги — проверить не могу.

Код AS3:
Apple(meal);
не делает ничего, вернее делает, но результат нигде не используется

Цитата:
Каждый раз писать (zzz as TestClass) тоже не дело.
не пишите. определяйте свойство/переменную сразу нужного типа.


В чём вообще проблема-то?
__________________
Отряд Котовскага


Последний раз редактировалось Котяра; 28.09.2010 в 10:24.
Старый 28.09.2010, 10:21
f.g.programmer вне форума Посмотреть профиль Отправить личное сообщение для f.g.programmer Найти все сообщения от f.g.programmer
  № 7  
Ответить с цитированием
f.g.programmer
 
Аватар для f.g.programmer

блогер
Регистрация: Sep 2010
Адрес: Россия
Сообщений: 137
Записей в блоге: 3
1. Сменить тип переменная не может, она может начать ссылаться на переменную другого типа (типа который расширяет тип объявленный, как тип переменной)
2. В meal он помещает объект типа, Apple, говоря Apple(meal) он прямо указывает, что переменная meal хранит Apple, хотя правильнее было бы (meal as Apple). Само по себе Apple(meal) ничего не значит, видимо это для того, чтобы показать как использовать приведение типов.

Старый 28.09.2010, 10:26
f.g.programmer вне форума Посмотреть профиль Отправить личное сообщение для f.g.programmer Найти все сообщения от f.g.programmer
  № 8  
Ответить с цитированием
f.g.programmer
 
Аватар для f.g.programmer

блогер
Регистрация: Sep 2010
Адрес: Россия
Сообщений: 137
Записей в блоге: 3
вот скрин
Миниатюры
Нажмите на изображение для увеличения
Название: Clipboard02.jpg
Просмотров: 90
Размер:	42.2 Кб
ID:	25226  

Старый 28.09.2010, 10:29
f.g.programmer вне форума Посмотреть профиль Отправить личное сообщение для f.g.programmer Найти все сообщения от f.g.programmer
  № 9  
Ответить с цитированием
f.g.programmer
 
Аватар для f.g.programmer

блогер
Регистрация: Sep 2010
Адрес: Россия
Сообщений: 137
Записей в блоге: 3
Apple(meal) это скорее не приведение, а преобразование типов.
(meal as VirtualPet) не выдаст ошибки, а вернёт нул, видимо в этом и смысл записи Мука.

Старый 28.09.2010, 10:37
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 10  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Ну я ж говорил из контекста выдрали)
Главное в этом коде — это комменты. Больше этот код ничего не делает.
в первом случае - всё ок
во втором ошибка приведения типов. Всё.

Вот, кстати, вчера попалась заметка по разности скорости обработки: кастование против приведения - "bmp as Bitmap" в 4 раза быстрее чем Bitmap(bmp)

Цитата:
У меня несколько классов:TestClass1, TestClass2, TestClass3 ... и объектом какого класса станет zzz заранее незвестно.
Но вам же надо будет вызывать конкретные методы конкретных классов? значит будет известно.

Если не так, то вообще не надо приводить к конкретным классам.
Зваедите им общий класс TestClass в котором будет myMethod и оверрайдьте его в TestClass1, TestClass2, TestClass3
Код AS3:
package {
    import flash.display.*;
 
    public class MainClass extends Sprite {
        private var zzz:TestClass;
 
        public function MainClass() {
            zzz = new TestClass1();// ну или по getDefinitionByName и т.п.
            zzz.myMethod();
            addChild(zzz);
        }
    }
}
__________________
Отряд Котовскага


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

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

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


 


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


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