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

maklaus 16.12.2008 18:51

Как обратиться к переменной класса из другого класса?
 
Добрый день!

Есть класс документа main с константой WIN_WIDTH

Game/main.as
Код AS3:

package Game {
...
    public class Main extends MovieClip {
    ...
        public const WIN_WIDTH = stage.stageWidth;
    ...
}

Мне нужно обратиться к этой константе из другого класса Ship:

Game/Ship.as
Код AS3:

package Game {
...
    public class Ship extends MovieClip {
    ...
      public function Ship() {
          x=WIN_WIDTH/2;
      }
...
}

На это компилятор ругается: 1120: Access of undefined property WIN_WIDTH.

Подскажите как правильно к ней обратиться?

s8000_1 16.12.2008 19:15

Если хотите выровнять на сцене, то так выравнивать не надо. Используйте added_to_stage

А вообще static.

faust.d503 16.12.2008 19:18

x=WIN_WIDTH/2; - как компилятор должен догадаться что вам нужна переменная WIN_WIDTH из класса Main. Он ищет ее в себе, не находит и естественно ругается.
Код AS3:

x= Main.WIN_WIDTH/2;

И константу сделать не только public, а еще и static.

tikhop 16.12.2008 19:23

Можно использовать композицию.
Class A:
Код AS3:

package {
        import flash.display.Sprite;
 
        public class A extends Sprite
        {
                public function A()
                {
                        var b:B=new B();
                        trace(b.WIDTH);
                }
        }
}

Class B:
Код AS3:

package
{
        import flash.display.Sprite;
 
        public class B extends Sprite
        {
                public const WIDTH:Number=800;
 
                public function B()
                {
                        super();
                }
 
        }
}

Можно еще использовать статические свойства класса.

_Smirnoff 16.12.2008 20:47

Правильный вариант

Код AS3:

package {
import flash.display.Sprite;
 
public class A extends Sprite
{
public function A()
{
trace(B.WIDTH); // 800
}
}
}
 
 
package
{
import flash.display.Sprite;
 
public class B extends Sprite
{
public static const WIDTH:Number=800;
 
public function B()
{
}
}
}

В конструкторе B можно не писать super, его вызов будет неявным.

maklaus 16.12.2008 23:28

ОК! Всем спасибо за ответы!!! =)

etc 16.12.2008 23:42

Цитата:

Сообщение от _Smirnoff (Сообщение 784246)
В конструкторе B можно не писать super, его вызов будет неявным.

Вполне себе будет явным, если этот B будут создавать, как экземпляр, в противном случае никаких вывозов конструктора не будет. Если класс используется только лишь для хранения статических констант, то само описание конструктора можно опустить, а не оставлять обрубок без кода внутри. Если же планируется создавать экземпляры такого класса, то даже в случае, если конструктор пуст, он обязателен к описанию вместе с вызовом супер-конструктора.

maklaus 17.12.2008 10:17

Вопрос в догонку. Если исправить код на:

Код AS3:

package Game {
...
    public class Main extends MovieClip {
    ...
        public static const WIN_WIDTH = stage.stageWidth;
    ...
}
 
package Game {
...
    public class Ship extends MovieClip {
    ...
      public function Ship() {
          Main.x=WIN_WIDTH/2;
      }
...
}

то компилятор ругается:

1120: Access of undefined property stage.

Как исправить?

etc 17.12.2008 13:06

Дождаться события ADDED_TO_STAGE и присвоить значение стат. переменной.

_Smirnoff 17.12.2008 13:32

Цитата:

Сообщение от __etc (Сообщение 784294)
Вполне себе будет явным, если этот B будут создавать, как экземпляр, в противном случае никаких вывозов конструктора не будет. Если класс используется только лишь для хранения статических констант, то само описание конструктора можно опустить, а не оставлять обрубок без кода внутри. Если же планируется создавать экземпляры такого класса, то даже в случае, если конструктор пуст, он обязателен к описанию вместе с вызовом супер-конструктора.

Согласен с тем, что "Если класс используется только лишь для хранения статических констант, то само описание конструктора можно опустить, а не оставлять обрубок без кода внутри." Т.к. если грубо говорить, то этот класс превращается в enum.

B наследуется от Sprite. Конструктор Sprite не принимает инициализационных значений, а это значит, что в конструкторе наследника super можно не вызвать явно. Смысл был такой.


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

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