Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   typeof и элемент массива (http://www.flasher.ru/forum/showthread.php?t=105200)

Chas 10.12.2007 17:41

typeof и элемент массива
 
кусок моего кода:
Код:

import maped.data.sprites.*;
var a = new Array ();
var t = new Floor();
a.push (t);

trace (typeof a[0]); //выводит Object!!!!

с этим можно как-то стправится? я по типу достоваемого объекта собирался определять, что с ним делать. теперь, видимо придется добавлять какую-нить переменную-флаг

iNils 10.12.2007 17:43

Код:

trace (a[0] instanceof Floor); //// true

etc 10.12.2007 17:44

Все верно typeof возвращает, это же объект.

Chas 10.12.2007 18:16

ыть. я воспользовался typeof потому что instanceof Floor выдавало неправильный результат. ошибка где-то выше, я даже знаю, где примерно.
вот код:
Код:

var sprite = Core.spritedata[btnPlacing.curSprite].copy();
sprite.test ();
trace ("WTools:cellInvoke. sprite instanceof Floor="+(sprite instanceof Floor)); //false
trace ("WTools:cellInvoke. sprite instanceof Sprite="+(sprite instanceof Sprite)); //true

класс Floor нужен, хотя он пока "пустой"
Код:

import maped.data.sprites.Sprite;
class maped.data.sprites.Floor extends Sprite {
        function Floor (node:XMLNode){
                super (node);
        }
        function copy (){
                var c:Floor= super.copy ();
                return c;
        }
}

класс-родитель:
Код:

class maped.data.sprites.Sprite {
        var frame; var name;
        function Sprite (node:XMLNode){
                frame = Number (node.attributes.frame);
                name=node.attributes.name;
        }
        function copy (){
                var c = new Sprite ();
                c.frame = frame;
                c.name = name;
                return c;
        }
}

ошибка видимо в том, что в Floor:copy я обращаюсь к super.copy (), который возвращает объект Sprite. Ка только это исправить? Не пользоваться родительским copy()?

iNils 10.12.2007 18:35

Core.spritedata[btnPlacing.curSprite] - это объект какого класса?

Chas 10.12.2007 18:40

Код:

class maped.data.Spritedata extends Array{
//        var sprites:Array;
        var xml:XML;
        var loaded:Boolean;
        function Spritedata (){
                loaded=false;
        }
       
        function load (file){
                xml = new XML ();
                xml.load (file);
                xml.onLoad = Delegate.create (this,onLoad);
        }
        function onLoad (success){
                if (success){
                        for (var i=0; i< xml.firstChild.childNodes.length; i++){
                                var node:XMLNode = xml.firstChild.childNodes[i];
                                switch (node.nodeName){
                                        case 'floor':
                                                this.push (new Floor (node));
                                        break;
                                        case 'object':
                                                this.push (new Obj (node));
                                        break;
                                        case 'east_wall':
                                                this.push (new EastWall(node));
                                        break;
                                        case 'north_wall':
                                                this.push (new NorthWall(node));
                                        break;
                                }
                        }
                        loaded=true;
                } else {
                        trace ("Spritedata:onLoad. загрузить не удалось.");
                }
        }
}


iNils 10.12.2007 18:56

У меня такой вопрос метод copy не берет ничего от экземпляра, то почему это метод экземпляра, а не класса?

Chas 10.12.2007 20:11

метод copy () преднозначен для создания копии экземпляра класса. В новой копии можно будет изменять значения, не боясь, что они изменятся в оригинальном экземпляре. Выполняют ту роль, для которой перегружают оператор = в спп.
Здесь я попытался сделать следующее. когда для экземпляра класса Floor вызывается copy (),
Код:

function copy (){
                var c:Floor= super.copy ();
                return c;
        }

то он вызывает такую же функцию класса-родителя Sprite.
Код:

function copy (){
                var c = new Sprite ();
                c.frame = frame;
                c.name = name;
                return c;
        }

которая копирует свойства общие для Sprite и Floor. Но в результате получается, что ф-ия copy () класса Floor возаращает экземпляр Sprite, несмотря на var c:Floor= super.copy ()

можно его как-то преобразовать(то что называется type cast) в экземпляр класса Floor?

iNils 10.12.2007 20:15

Метод copy в Floor делает не копию экземпляра Floor, а новый экземпляр класса Sprite. Естественно instanceof Floor выдаст false.

Chas 10.12.2007 20:25

а можно принудительео объект из super.copy() привести к Floor? ну, так, как мы приводим строку в число
str = "10"; n = Number(str);
или это должно быть предусмотрено конструктором класса?


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

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