Форум 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=145036)

filepark 28.09.2010 06:03

приведение типов (не получается)
 
не понимаю почему не удаётся привести тип объекта к нужному. Код ниже, 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, но методы этого класса вызвать не может. Как же так?

Котяра 28.09.2010 07:58

Код 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);
                }
        }
}


filepark 28.09.2010 08:09

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

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

КорДум 28.09.2010 08:28

Код AS3:

zzz1 = zzz as TestClass;
zzz1.myMethod();


filepark 28.09.2010 10:02

но в этом случае всё равно придётся объявлять тип переменной zzz1 заранее.

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

Котяра 28.09.2010 10:17

1. Нет. Может только принять расширенный тип.

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

Код AS3:

Apple(meal);

не делает ничего, вернее делает, но результат нигде не используется

Цитата:

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


В чём вообще проблема-то?

f.g.programmer 28.09.2010 10:21

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

f.g.programmer 28.09.2010 10:26

Вложений: 1
вот скрин

f.g.programmer 28.09.2010 10:29

Apple(meal) это скорее не приведение, а преобразование типов.
(meal as VirtualPet) не выдаст ошибки, а вернёт нул, видимо в этом и смысл записи Мука.

Котяра 28.09.2010 10:37

Ну я ж говорил из контекста выдрали)
Главное в этом коде — это комменты. Больше этот код ничего не делает.
в первом случае - всё ок
во втором ошибка приведения типов. Всё.

Вот, кстати, вчера попалась заметка по разности скорости обработки: кастование против приведения - "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);
        }
    }
}


filepark 28.09.2010 12:18

Спасибо! Теперь понял! :)

ShimoBB 28.09.2010 14:54

Цитата:

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

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

тип переменной zzz вы не сможете поменять, она строго типизирована.
введите локальную переменную и её делайте нужного вам типа например так:
Код AS3:

package {
        import flash.display.*;
 
        public class MainClass extends Sprite {
                private var zzz:Sprite;
 
                public function MainClass() {
                        var yyy:TestClass= new TestClass();
                        zzz=yyy;
                        yyy.myMethod();
                        addChild(yyy);
                }
        }
}


КорДум 28.09.2010 18:25

Код AS3:

zzz=yyy;

И здесь получите РТЕ, разве нет?


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

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