2013-07-20 2 views
0

что-то не так с моей инкапсуляцией, но я не знаю, что это такое:AS3 Почему я использую get/getter неправильно?

Я получил класс документа с именем Main привязан к сцене:

package { 

import flash.display.MovieClip; 

    public class Main extends MovieClip 
    { 
    var chapter1:Chapter1; 

    public function Main() { 
     // constructor code 
     chapter1 = new Chapter1; 
     addChild(chapter1); 
    } 
    } 
} 

класса chapter1 привязанного к MovieClip:

package { 

import flash.display.MovieClip; 
import flash.events.Event; 
import flash.events.TimerEvent; 
import flash.utils.Timer; 

public class Chapter1 extends MovieClip { 

    public var numberOfFrames:uint; 

    public function Chapter1() 
    { 
     numberOfFrames = 3; 

     //constructor 
     trace("Chapter 1 constructed"); 
     Transition.moveFromTo(); 

    } 

    public static function get getNumberOfFrames():uint 
    { 
     return numberOfFrames; 
    } 

} 
} 

и класс под названием Transition, который я хотел бы использовать в качестве простой утилиты:

package { 

public class Transition { 

    public var gotNumber:uint; 

    public function Transition() { 
     trace(Chapter1.getNumberOfFrames); 
    } 

    static public function moveFromTo() 
    { 
     /* in the end id like to use this as a utility working with 
        NumberOfFrames from a parent Chapter instance.*/ 
    } 

} 
} 

Я получаю сообщение об ошибке: «1120: доступ к неопределенному номеру свойстваOfFrames». поэтому сама функция геттера, по-видимому, не должна использовать numberOfFrames. Но я не понимаю, почему, поскольку все примеры, которые я нашел (хотя и работают только с двумя классами и без привязки), делают getter возвратом var так же. Я что-то пропустил?

ответ

0

Функция getNumberOfFrames() является статической функцией, но она пытается получить доступ к numberOfFrames, который является переменной-членом экземпляра. Вы должны создать экземпляр Chapter1, так что будет выделен экземпляр numberOfFrames - numberOfFrames не существует вне определенного экземпляра Chapter1.

Кроме того, функция getNumberOfFrames() нуждается в доступе к экземпляру Chapter1 для извлечения его члена numberOfFrames - статическая функция существует за пределами каждого экземпляра.

Одним из возможных решений является назначение экземпляра Chapter1 вашему классу Transition, чтобы внутри вы могли использовать этот экземпляр при попытке получить количество кадров.

Если вы можете иметь несколько Chapter1 и несколько Transition объектов в вашей программе, я предлагаю удаление static ключевых слов из классов, так как все статические функции потребуется экземпляр для работы.

+0

thanx для информации. ключевое слово static легко удалить. но я думал, что создаю экземпляр Chapter1 с именем «chapter1» внутри главного конструктора с помощью нового ключевого слова и метода addChild(). Кажется, я тоже ошибаюсь. я думаю, я действительно не понимал создание экземпляров (darn) ... – gauguerilla

+0

@gauguerilla Когда вы создаете мувиклип, вы действительно создаете экземпляр. Однако этот экземпляр напрямую не доступен вашему коду. Вы должны вызвать 'getChildByName()' против родительского клипа, чтобы получить ссылку на этот экземпляр. После этого вы сможете получить доступ к своим общедоступным свойствам/методам. – xxbbcc

+0

@gauguerilla Если вы создаете свой клип в коде с помощью 'new', вы также можете просто сохранить ссылку на этот мувиклип в переменной-члене одного из ваших классов (где это имеет смысл), а затем получить к нему доступ позже. В этом случае вы можете избежать использования 'getChildByName()', что несколько дорого. – xxbbcc

0

Вы определили геттер как статический. Просто удалите статическое ключевое слово:

public function get getNumberOfFrames():uint 
{ 
    return numberOfFrames; 
} 

Определение что-то в качестве статического означает, что каждый экземпляр класса использует один экземпляр свойства или метода - им угадать, что это не то, что вы хотите (предположительно каждая глава создается может иметь разные значения для numberOfFrames?)

+0

точно! Я хочу иметь разные главы с разными numberOfFrames, но использовать все тот же метод из класса Transition. спасибо за быстрый ответ. кажется, у меня намного больше неправильного пути (инициализирующая глава1, см. комментарий xxbbccs). удаление ключевого слова static приводит к другой ошибке: «1119: доступ к возможно неопределенному свойству getNumberOfFrames через ссылку со статическим типом класса». – gauguerilla

Смежные вопросы