![]() |
|
||||||||||
|
|||||
|
Регистрация: Jul 2009
Сообщений: 77
|
не понимаю почему не удаётся привести тип объекта к нужному. Код ниже, MainClass - основной.
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); } } } 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; } } } в моём понимании 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. |
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
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); } } }
__________________
Отряд Котовскага |
|
|||||
|
Регистрация: 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. |
|
|||||
|
Регистрация: Jul 2009
Сообщений: 77
|
но в этом случае всё равно придётся объявлять тип переменной zzz1 заранее.
Вопрос 1: может ли переменная сменить свой тип? Вопрос 2: как понимать цитату из книги (Мук на стр.191)? |
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
1. Нет. Может только принять расширенный тип.
2. Мук не прав. Либо вы вырвали из контекста. Под рукой нет книги — проверить не могу. не делает ничего, вернее делает, но результат нигде не используется Цитата:
В чём вообще проблема-то?
__________________
Отряд Котовскага Последний раз редактировалось Котяра; 28.09.2010 в 10:24. |
|
|||||
|
1. Сменить тип переменная не может, она может начать ссылаться на переменную другого типа (типа который расширяет тип объявленный, как тип переменной)
2. В meal он помещает объект типа, Apple, говоря Apple(meal) он прямо указывает, что переменная meal хранит Apple, хотя правильнее было бы (meal as Apple). Само по себе Apple(meal) ничего не значит, видимо это для того, чтобы показать как использовать приведение типов. |
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
Ну я ж говорил из контекста выдрали)
Главное в этом коде — это комменты. Больше этот код ничего не делает. в первом случае - всё ок во втором ошибка приведения типов. Всё. Вот, кстати, вчера попалась заметка по разности скорости обработки: кастование против приведения - "bmp as Bitmap" в 4 раза быстрее чем Bitmap(bmp) Цитата:
Если не так, то вообще не надо приводить к конкретным классам. Зваедите им общий класс TestClass в котором будет myMethod и оверрайдьте его в TestClass1, TestClass2, TestClass3
__________________
Отряд Котовскага Последний раз редактировалось Котяра; 28.09.2010 в 10:55. |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:21. |
|
|
« Предыдущая тема | Следующая тема » |
|
|