Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 26.01.2013, 23:10
Dip52 вне форума Посмотреть профиль Отправить личное сообщение для Dip52 Найти все сообщения от Dip52
  № 1  
Ответить с цитированием
Dip52

Регистрация: Aug 2012
Сообщений: 297
По умолчанию Как изменять значение статической переменной из другого класса?

Здравствуйте.
Подскажите, пожалуйста.
Как можно изменить значение статической переменной с модификатором управления доступом public из другого класса?
Есть два класса.
Первый (ПервыйКласс) содержит локальную переменную, которая создаёт объект (экземпляр класса ВторойКласс).
Экземпляр второго класса (ВторойКласс) содержит статическую переменную staticVar.
Когда я обращаюсь с первого класса (ПервыйКласс) к статической переменной staticVar объекта (экземпляра класса ВторойКласс) возникает "ошибка" такого типа: ReferenceError: Error #1069: Не удалось найти свойство staticVar в src.BelowDoctrine; отсутствует значение по умолчанию.
at src:octrine().

Как можно исправить этот недуг?
Заранее большое спасибо.

Старый 26.01.2013, 23:11
sampo вне форума Посмотреть профиль Найти все сообщения от sampo
  № 2  
Ответить с цитированием
sampo
Banned

Регистрация: Jan 2013
Сообщений: 14
вроде,если я не ошибась,необходимо указать класс,к статическому свойству которого вы хотите обратиться,то есть
напишу "по вашему"
первый класс
Код AS3:
var 2Класс:ВторойКласс = new Второй класс();
2Класс.статическое свойство = значение на которое хотите изменить.
Должно работать

з.ы.вообще говоря не очень хорошо использовать свойства с модификатором public, хорошо было бы брать private,используя эту переменную в конструкторе,который в свою очередь по определению public,но при этом не будет возможности случайно изменить вашу статическую переменную.


Последний раз редактировалось sampo; 26.01.2013 в 23:21. Причина: вспомнил.
Старый 26.01.2013, 23:20
Dip52 вне форума Посмотреть профиль Отправить личное сообщение для Dip52 Найти все сообщения от Dip52
  № 3  
Ответить с цитированием
Dip52

Регистрация: Aug 2012
Сообщений: 297
Цитата:
Сообщение от sampo Посмотреть сообщение
вроде,если я не ошибась,необходимо указать класс,к статическому свойству которого вы хотите обратиться,то есть

первый класс
Код AS3:
var 2Класс:ВторойКласс = new Второй класс();
2Класс.статическое свойство = значение на которое хотите изменить.
Должно работать
Я так и делал. Просто я не понимаю зачем тогда статическому свойству модификатор управления доступом (public,...)?

Старый 26.01.2013, 23:28
sampo вне форума Посмотреть профиль Найти все сообщения от sampo
  № 4  
Ответить с цитированием
sampo
Banned

Регистрация: Jan 2013
Сообщений: 14
Статическое свойство как и обычное свойство лучше использовать с модификатором доступа private.
Фишка статического свойства в том что привязан к самому классу а не к его экземпляру.

Отсутсвует значение по умолчанию,у вашей статики такой вид?

Код AS3:
private static var staticVar:String = "статическая переменная";
значение должно быть определено изначально.

Старый 26.01.2013, 23:33
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 5  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
Экземпляр второго класса (ВторойКласс) содержит статическую переменную staticVar.
Экземпляр не может содержать статическую переменную. Статическая переменная принадлежит классу, а не экземпляру. Для того, чтобы изменить значение статической переменной, нужно обратиться к ней из любого места кода через класс:
Код AS3:
ClassName.staticVar = 10;
В ActionScript классы мало отличаются от других объектов. Точнее - они являются такими же объектами, как и все остальные. И для них действуют те же правила, что и для экземпляров. Возьмем пример:
Код AS3:
var a:Sprite = new Sprite();
var b:Sprite = new Sprite();
 
a.x = 10;
b.x = 15;
Вас же не удивляет, что для того чтобы подвинуть объект a нужно обратиться к самому объекту а? И то же самое работает и с b - хотим его подвинуть, значит меняем его свойство.
Так же точно все и с классами - хотим поменять свойство класса - обращаемся к классу. А не к экземпляру или еще чему-то.

Вот еще одна аналогия:
Представьте что на столе у вас лежит чертеж самолета. Обычный самый чертеж, карандашом на бумаге. И тут же рядом разбросаны детали для модели такого самолета. И мы с вами берем детали, смотрим на чертеж и собираем одну за одной модели самолетов.

Так вот отношение класса и экземпляра в ActionScript - оно точно такое же как отношение чертежа и модели самолета в этом примере. То есть если вы измените чертеж (дорисуете еще одно кресло в кабине пилота, например), то те модельки, которые мы уже собрали от этого не изменятся. И то же с моделями - поменяв модель мы никак не меняем чертеж. И все же чертеж при этом остается документом, по которому можно собирать новые модели и одновременно остается таким же объектом, как и сами модели.


Цитата:
Статическое свойство как и обычное свойство лучше использовать с модификатором доступа private.
Ерунду пишете
__________________
...вселенская грусть

Старый 26.01.2013, 23:40
Dip52 вне форума Посмотреть профиль Отправить личное сообщение для Dip52 Найти все сообщения от Dip52
  № 6  
Ответить с цитированием
Dip52

Регистрация: Aug 2012
Сообщений: 297
Цитата:
Сообщение от gloomyBrain Посмотреть сообщение
Экземпляр не может содержать статическую переменную. Статическая переменная принадлежит классу, а не экземпляру. Для того, чтобы изменить значение статической переменной, нужно обратиться к ней из любого места кода через класс:
Код AS3:
ClassName.staticVar = 10;
В ActionScript классы мало отличаются от других объектов. Точнее - они являются такими же объектами, как и все остальные. И для них действуют те же правила, что и для экземпляров. Возьмем пример:
Код AS3:
var a:Sprite = new Sprite();
var b:Sprite = new Sprite();
 
a.x = 10;
b.x = 15;
Вас же не удивляет, что для того чтобы подвинуть объект a нужно обратиться к самому объекту а? И то же самое работает и с b - хотим его подвинуть, значит меняем его свойство.
Так же точно все и с классами - хотим поменять свойство класса - обращаемся к классу. А не к экземпляру или еще чему-то.

Вот еще одна аналогия:
Представьте что на столе у вас лежит чертеж самолета. Обычный самый чертеж, карандашом на бумаге. И тут же рядом разбросаны детали для модели такого самолета. И мы с вами берем детали, смотрим на чертеж и собираем одну за одной модели самолетов.

Так вот отношение класса и экземпляра в ActionScript - оно точно такое же как отношение чертежа и модели самолета в этом примере. То есть если вы измените чертеж (дорисуете еще одно кресло в кабине пилота, например), то те модельки, которые мы уже собрали от этого не изменятся. И то же с моделями - поменяв модель мы никак не меняем чертеж. И все же чертеж при этом остается документом, по которому можно собирать новые модели и одновременно остается таким же объектом, как и сами модели.
Хорошо, я понял. Только объясните ещё одно: зачем тогда они имеют модификаторы управления доступом?

Старый 26.01.2013, 23:44
sampo вне форума Посмотреть профиль Найти все сообщения от sampo
  № 7  
Ответить с цитированием
sampo
Banned

Регистрация: Jan 2013
Сообщений: 14
propMine , то есть вы хотите сказать что вы используете статические методы ол public?
я сомневаюсь что я написал ерунду.Переменные которые написаны с модиком public ,запросто можно изменить даже не догадываясь об этом и здесь нет разницы, статические или обычные свойства.Ну вы видимо всё делаете по чертежам,такое трудно осознать...

Добавлено через 1 минуту
Цитата:
Сообщение от Dip52 Посмотреть сообщение
Хорошо, я понял. Только объясните ещё одно: зачем тогда они имеют модификаторы управления доступом?
Для того что бы нельзя было изменить из кода "из вне" Как и обычные переменные.

Старый 26.01.2013, 23:57
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 8  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
Хорошо, я понял. Только объясните ещё одно: зачем тогда они имеют модификаторы управления доступом?
Ну как зачем? За тем же, зачем и все остальные (не статические) члены класса. Чтобы регулировать доступ к себе.
Раз уж у меня сегодня вечер аналогий... Например я хочу, чтобы к данному свойству класса (не экземпляра) можно было обратиться только из этого класса. Для этого я напишу:
Код AS3:
public class Rabbit {
 
    private static var carrotStory:String = "carrot is a lie!";
 
    public function Rabbit() {
        trace("new rabbit created");
    }
 
    public function tellMeAboutCarrot():void {
        trace(Rabbit.carrotStory);
    }
 
}
Видите - я сделал класс Кролик (Rabbit) и только кролики будут знать правду о морковке (carrot). Проверим:
Код AS3:
var one:Rabbit = new Rabbit();
var two:Rabbit = new Rabbit();
 
one.tellMeAboutCarrot(); // выведется сообщение
two.tellMeAboutCarrot(); // снова видим сообщение
 
trace(Rabbit.carrotStory); // а вот тут будет ошибка!
Видите? Кролики знают всю правду о морковке и могут рассказать если их попросить. Более того, сведения общие для всех кроликов, так как переменная у нас static. Однако сами мы получить эти сведения не можем, так как установлен модификатор доступа private (только внутри данного класса).


Цитата:
я сомневаюсь что я написал ерунду
Отриньте все сомнения. Модификаторы доступа не могут быть "лучше" или "хуже". Каждый из них хорош тогда, когда уместен.
__________________
...вселенская грусть

Старый 26.01.2013, 23:59
sampo вне форума Посмотреть профиль Найти все сообщения от sampo
  № 9  
Ответить с цитированием
sampo
Banned

Регистрация: Jan 2013
Сообщений: 14
Цитата:
Сообщение от gloomyBrain Посмотреть сообщение
Отриньте все сомнения. Модификаторы доступа не могут быть "лучше" или "хуже". Каждый из них хорош тогда, когда уместен.
при чем тут ерунда,плохая практика использовать максимально много модификаторов private?

Старый 27.01.2013, 00:15
strangedk вне форума Посмотреть профиль Отправить личное сообщение для strangedk Найти все сообщения от strangedk
  № 10  
Ответить с цитированием
strangedk
 
Аватар для strangedk

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
Цитата:
Сообщение от sampo Посмотреть сообщение
плохая практика использовать максимально много модификаторов private?
Модификаторы доступа нужно использовать такие, какие нужны в конкретный момент.
А вы рассуждаете как-то в стиле "private лучше чем public?"

Статика бывает и публичной и приватной. Не забывайте такюе, что статический метод имеет доступ только к статическим переменным.

Добавлено через 1 минуту
Цитата:
Сообщение от iflamberg Посмотреть сообщение
А так, в основном, статические переменные-методы обычно паблик. В этом же весь смысл.
Ну тоже не совсем правильно, бывает с десяток приватных статических переменных, и один публичный статический метод обрабатывающий их. Помним же, что у методов экземпляра есть доступ к статике, а у статики к методам (и переменным) экземпляра - нет.
__________________
adobe AS3 manual

Создать новую тему Ответ Часовой пояс GMT +4, время: 07:48.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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