|  Получить значения свойства одного класса из другого | 
 
	
Здравствуйте, гость ( Вход | Регистрация )
|  Получить значения свойства одного класса из другого | 
|    16.10.2010 - 12:05 
				 Сообщение
					#1
					
				
			 | |
|  Моdератор     Группа: Пользователь Сообщений: 874 Регистрация: 12.03.2008 Пользователь №: 4145  | 
				Есть класс документа: Код package { import flash.display.MovieClip; public class Main extends MovieClip { public var myVar:int; public function Main() { myVar = 5; } } } И есть другой класс. Как мне из другого класса получить значение свойства myVar класса документа? | 
|  | |
|  | 
|  16.10.2010 - 16:21 
				 Сообщение
					#2
					
				
			 | |
| Ветеран конференции     Группа: Flash Zone Team Сообщений: 3912 Регистрация: 10.03.2005 Из: Киев Пользователь №: 5  | Цитата И есть другой класс. Как мне из другого класса получить значение свойства myVar класса документа? Стандартным для ООП путём - через методы класса. Т.е. в одном классе (Main) ты создаёшь метод для доступа к свойству (myVar), а из другого класса (из любых других классов) к нему обращаешься. Добавь в класс Main следующий метод: Код        public function getVar() { return myVar; } При этом само свойство myVar ты можешь сделать private, а не public (чтобы только через методы можно было к нему обратиться). Иначе можно будет напрямую к свойству обращаться. Код Main MyObject = new Main(); trace(MyObject.getVar()); // обращение через метод (при myVar как public, так и private) trace(MyObject.myVar); // обращение напрямую к свойству (при myVar как public) При myVar как public возможно не только чтение, но и запись напрямую в свойство (MyObject.myVar = 1), а если бы myVar был private, то этого нельзя было бы сделать (ни прочитать, ни записать напрямую), и для записи нужно было бы сделать соответствующий метод. | 
|  | |
|  16.10.2010 - 16:29 
				 Сообщение
					#3
					
				
			 | |
|  Моdератор     Группа: Пользователь Сообщений: 874 Регистрация: 12.03.2008 Пользователь №: 4145  | 
				Вообще экземпляр класса документа создаётся только один раз, MustLive. Мне нудно получить именно из него это свойство. Ты в курсе что такое класс документа? Сообщение отредактировал HaWK - 16.10.2010 - 16:30 | 
|  | |
|  17.10.2010 - 01:43 
				 Сообщение
					#4
					
				
			 | |
| Ветеран конференции     Группа: Flash Zone Team Сообщений: 3912 Регистрация: 10.03.2005 Из: Киев Пользователь №: 5  | Цитата Вообще экземпляр класса документа создаётся только один раз, MustLive. Мне нудно получить именно из него это свойство. HaWK Ну раз создался у тебя один раз экземпляр, то и считывай из него свойства. Как это сделать, я описал выше. Класс документа ты описал как class Main (т.е. я понял, что это какой-то твой класс). Вот я и привёл пример кода для работы с ним. Если это какой-то стандартный класс (а с классами AS3 я не знаком), поставляемый с флешем, то почитай его документацию или изучи исходник (если нет возможности/времени/желания читать документацию), и воспользуйся теми способами, что я описал выше. И прочитаешь значение этого свойства. | 
|  | |
|  17.10.2010 - 22:28 
				 Сообщение
					#5
					
				
			 | |
|  Моdератор     Группа: Пользователь Сообщений: 874 Регистрация: 12.03.2008 Пользователь №: 4145  | 
				Да это мой класс. И его экземпляр создаётся один раз (самим Flash). Вот как к нему обратится я не знаю.
				
				
				
			 | 
|  | |
|  17.10.2010 - 23:33 
				 Сообщение
					#6
					
				
			 | |
| Ветеран конференции     Группа: Flash Zone Team Сообщений: 3912 Регистрация: 10.03.2005 Из: Киев Пользователь №: 5  | Цитата И его экземпляр создаётся один раз (самим Flash). Вот как к нему обратится я не знаю. Откуда ты знаешь, что он создаётся? Если ты об этом читал в какой-либо документации, то там и прочитай о том, как к данному экземпляру обратиться. Чтобы проверить, что флеш автоматически создаёт экземпляр класса Main, возьми в конструкторе класса (function Main()) выведи трейс (за myVar), чтобы получить результат в окне Output: Код myVar = 5; trace(myVar); Если этот экземпляр создаётся (что ты проверишь вышеприведённым кодом), то у него есть имя. Вот имя этого экземпляра тебе н.б. выяснить. И по имени обращаться к свойству (одним из двух способов, что я описал ранее). | 
|  | |
|  18.10.2010 - 01:11 
				 Сообщение
					#7
					
				
			 | |
|  Моdератор     Группа: Пользователь Сообщений: 874 Регистрация: 12.03.2008 Пользователь №: 4145  | 
				ML!  Цитата Откуда ты знаешь, что он создаётся? Если ты об этом читал в какой-либо документации, то там и прочитай о том, как к данному экземпляру обратиться. Не нужно читать об этом, об этом уже пора знать. В AS3 совсем другая структура. Если допустим в AS2 я мог на руте объявить переменную и потом обращаться к ней с любого места программы просто через _root.myVar, то в AS3 так уже не получится. _root - теперь это класс документа и фиг знает как к нему обратится извне (с других классов). Если внутри него я ещё могу читать его же свойства, то извне не могу. Вот мне и надо выяснить как это делать, поэтому я создал тему. Если бы мне просто надо было получить свойство я бы не писал здесь. Мне надо получить свойство класса документа (то бишь _root) из другого класса. | 
|  | |
|  18.10.2010 - 12:13 
				 Сообщение
					#8
					
				
			 | |
|  Ветеран конференции     Группа: Пользователь Сообщений: 777 Регистрация: 27.02.2009 Из: Moscow Пользователь №: 9144  | |
|  | |
|  18.10.2010 - 12:22 
				 Сообщение
					#9
					
				
			 | |
|  Моdератор     Группа: Пользователь Сообщений: 874 Регистрация: 12.03.2008 Пользователь №: 4145  | 
				Ладно, я в курсе этого. Но почему когда я пишу в другом классе: Код trace(root.myVar); Получаю: 1120: Обращение несуществующего свойства root. ? ? ? | 
|  | |
|  18.10.2010 - 12:28 
				 Сообщение
					#10
					
				
			 | |
|  Ветеран конференции     Группа: Пользователь Сообщений: 777 Регистрация: 27.02.2009 Из: Moscow Пользователь №: 9144  | 
				А в другом классе вообще может не быть свойства root, если это не потомок DisplayObject, либо оно может быть равным null. | 
|  | |
|  18.10.2010 - 12:29 
				 Сообщение
					#11
					
				
			 | |
|  Моdератор     Группа: Пользователь Сообщений: 874 Регистрация: 12.03.2008 Пользователь №: 4145  | 
				А как обратится к свойству экземпляра класса документа из другого класса?
				
				
				
			 | 
|  | |
|  18.10.2010 - 12:34 
				 Сообщение
					#12
					
				
			 | |
|  Ветеран конференции     Группа: Пользователь Сообщений: 777 Регистрация: 27.02.2009 Из: Moscow Пользователь №: 9144  | 
				Передать в этот другой класс ссылку на себя при построении, например. Типа: // Из класса Документа // var otherClass:OtherClass=new OtherClass(this) | 
|  | |
|  18.10.2010 - 12:35 
				 Сообщение
					#13
					
				
			 | |
|  Моdератор     Группа: Пользователь Сообщений: 874 Регистрация: 12.03.2008 Пользователь №: 4145  | 
				эээ.... и как всё это должно работать? Как мне потом обращаться из этого другого класса? Сообщение отредактировал HaWK - 18.10.2010 - 12:38 | 
|  | |
|  18.10.2010 - 12:41 
				 Сообщение
					#14
					
				
			 | |
|  Ветеран конференции     Группа: Пользователь Сообщений: 777 Регистрация: 27.02.2009 Из: Moscow Пользователь №: 9144  | Код package { import flash.display.* public class Main extends Sprite { public const DELTA="qewqw" public function Main(){ var z=new A(this) z.use1() } } } Код package {     public class A { var pat public function A(par){ pat=par } public function use1(){ trace("суперкласс "+pat.DELTA) } } } Можно так. Можно в Main статическое свойство сделать с ссылкой на свой единственный экземпляр. Много способов. PS Кстати в AS1/2 _root может быть также не единственным. | 
|  | |
|  18.10.2010 - 12:46 
				 Сообщение
					#15
					
				
			 | |
|  Моdератор     Группа: Пользователь Сообщений: 874 Регистрация: 12.03.2008 Пользователь №: 4145  | 
				Вообще у меня конструктор другого класса занят другими параметрами, а тут в качестве параметра конструктору передаётся экземпляр документа класса. Всё так запутанно, лучше другие способы   , или это лучший? | 
|  | |
|  18.10.2010 - 12:54 
				 Сообщение
					#16
					
				
			 | |
|  Ветеран конференции     Группа: Пользователь Сообщений: 777 Регистрация: 27.02.2009 Из: Moscow Пользователь №: 9144  | |
|  | |
|  18.10.2010 - 22:37 
				 Сообщение
					#17
					
				
			 | |
|  Моdератор     Группа: Пользователь Сообщений: 874 Регистрация: 12.03.2008 Пользователь №: 4145  | 
				Я так понял лучше сделать так: public static var prop:DisplayObject = this; И потом обращаться в любом классе: Main.prop.myvar Хотя я ещё не пробовал, но надеюсь сработает | 
|  | |
|  19.10.2010 - 11:49 
				 Сообщение
					#18
					
				
			 | |
|  Моdератор     Группа: Пользователь Сообщений: 874 Регистрация: 12.03.2008 Пользователь №: 4145  | 
				Да... ни фига не получилось. Вот: 1042: Ключевое слово "this" не может использоваться в статических методах. Оно может использоваться только в методах экземпляра, в закрытии функций и в глобальных кодах. | 
|  | |
|  19.10.2010 - 12:03 
				 Сообщение
					#19
					
				
			 | |
|  Ветеран конференции     Группа: Пользователь Сообщений: 777 Регистрация: 27.02.2009 Из: Moscow Пользователь №: 9144  | Да... ни фига не получилось. Вот: 1042: Ключевое слово "this" не может использоваться в статических методах. Оно может использоваться только в методах экземпляра, в закрытии функций и в глобальных кодах. Все правильно, в статических МЕТОДАХ как же можно использовать this? Статические методы и свойства - это методы и свойства класса. public static var prop:DisplayObject // просто объявляем а вот в конструкторе класса уже вставим значение this: prop=this | 
|  | |
|  19.10.2010 - 12:09 
				 Сообщение
					#20
					
				
			 | |
|  Моdератор     Группа: Пользователь Сообщений: 874 Регистрация: 12.03.2008 Пользователь №: 4145  | 
				Ошибочка: trace(Main.prop.myVar); 1119: Обращение возможного неопределенного свойства myVar через ссылку со статическим типом flash.display:DisplayObject . | 
|  | |
|   | 
|   | Текстовая версия | Сейчас: 5.11.2010 - 20:10 |