2012-03-14 2 views
0

new to Actionscript, OOP, этот форум и т. Д. !! У меня большой проект, над которым я работаю, очень сильно текст и кнопка. Я хочу создать массив строк в текстовом классе, доступ к которому можно получить с помощью основного класса документа. Тогда я смогу заполнить текстовое поле элементами в массиве. Цель этого заключается в том, чтобы избежать наличия массивных строк текста в моем основном документе ... но я не могу даже заставить свой тест работать. Компилятор говорит мне, что массив (txt1) не определен. Во-первых, вот мой код массива:AS3: Как получить доступ к свойству/методу из другого класса?

//text array class:format5000 
    package { 

    import flash.display.MovieClip; 
    import flash.text.*; 
    import flash.events.MouseEvent; 

    public class format5000 extends MovieClip { 

     private var txt1:Array = []; 

    public function format5000() { 
     // constructor code 
     txt1[0] = "This is the first txt string"; 
     trace("format loaded"); 
     trace(txt1[0]); 
} } } 

А вот код для основной документ:

//main doc class: text5001 
package { 

    import flash.display.MovieClip; 
    import flash.display.*; 
    import flash.events.*; 
    import flash.text.*; 


    public class text5001 extends MovieClip{ 

     private var myText:TextField; 
     private var theformat:format5000; 

    public function text5001() { 
     // constructor code 

     theformat = new format5000(); 

     addChild(theformat); 
     myText = new TextField(); 
     myText.text = txt1[0]; 
     myText.x = 50; 
     myText.y = 50; 
     addChild(myText); 
     trace("text loading..."); 
} } } 

ответ

-1

Добро пожаловать в Stack !. Этот var должен быть общедоступным, чтобы другие классы могли получить к нему доступ.

private var txt1:Array = []; 

должен быть

public var txt1:Array = []; 

так что ваша строка кода будет:

myText.text = theformat.txt1[0]; 
+0

Я не знаю, где вы получили 'root' из, код будет' theformat.txt1 [0 ] ' – jhocking

+0

hm, похоже, что это было отредактировано, но нет никакого уведомления об изменении – jhocking

+0

Я редактировал, когда вы отмечали;) – crooksy88

1

Обратите внимание, что ключевое слово private перед переменной? Это означает, что переменная работает только внутри объекта и не может быть доступна за пределами объекта.

Вы можете объявить переменную как public вместо этого, а затем вы можете получить доступ к нему с помощью точечной нотации, как так: theformat.txt1[0]

Однако общественные переменных является своим родом плохой практики, так что вы могли бы быть лучше реструктуризацией коды так что массив не должен быть доступен за пределами объекта, в котором он существует. Я имею в виду, что вы не объяснили, для чего предназначен класс format5000; Я хотел бы создать метод createTextfield() в формате5000, а затем вызвать этот метод из основного класса.

Так в format5000 я бы написал

public function createTextField(index:int):TextField { 
    var myText:TextField = new TextField(); 
    myText.text = txt1[index]; 
    return myText; 
} 

, а затем в text5001

theformat = new format5000(); 
myText = theformat.createTextField(0); 
myText.x = 50; 
myText.y = 50; 
addChild(myText); 
+0

Genius! Я очень благодарен. Из любопытства я попытался изменить доступ к «публике», который сработал. Но я хочу использовать наилучшую практику с самого начала, поэтому вместо этого я принял ваш совет и создал функцию в классе format5000. Еще раз спасибо за ваше время! –

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