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

Dip52 26.01.2013 23:10

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

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

sampo 26.01.2013 23:11

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

var 2Класс:ВторойКласс = new Второй класс();
2Класс.статическое свойство = значение на которое хотите изменить.

Должно работать

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

Dip52 26.01.2013 23:20

Цитата:

Сообщение от sampo (Сообщение 1117962)
вроде,если я не ошибась,необходимо указать класс,к статическому свойству которого вы хотите обратиться,то есть

первый класс
Код AS3:

var 2Класс:ВторойКласс = new Второй класс();
2Класс.статическое свойство = значение на которое хотите изменить.

Должно работать

Я так и делал. Просто я не понимаю зачем тогда статическому свойству модификатор управления доступом (public,...)?

sampo 26.01.2013 23:28

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

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

Код AS3:

private static var staticVar:String = "статическая переменная";

значение должно быть определено изначально.

gloomyBrain 26.01.2013 23:33

Цитата:

Экземпляр второго класса (ВторойКласс) содержит статическую переменную 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.
Ерунду пишете

Dip52 26.01.2013 23:40

Цитата:

Сообщение от gloomyBrain (Сообщение 1117968)
Экземпляр не может содержать статическую переменную. Статическая переменная принадлежит классу, а не экземпляру. Для того, чтобы изменить значение статической переменной, нужно обратиться к ней из любого места кода через класс:
Код 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 - оно точно такое же как отношение чертежа и модели самолета в этом примере. То есть если вы измените чертеж (дорисуете еще одно кресло в кабине пилота, например), то те модельки, которые мы уже собрали от этого не изменятся. И то же с моделями - поменяв модель мы никак не меняем чертеж. И все же чертеж при этом остается документом, по которому можно собирать новые модели и одновременно остается таким же объектом, как и сами модели.

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

sampo 26.01.2013 23:44

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

Добавлено через 1 минуту
Цитата:

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

Для того что бы нельзя было изменить из кода "из вне" Как и обычные переменные.

gloomyBrain 26.01.2013 23:57

Цитата:

Хорошо, я понял. Только объясните ещё одно: зачем тогда они имеют модификаторы управления доступом?
Ну как зачем? За тем же, зачем и все остальные (не статические) члены класса. Чтобы регулировать доступ к себе.
Раз уж у меня сегодня вечер аналогий... Например я хочу, чтобы к данному свойству класса (не экземпляра) можно было обратиться только из этого класса. Для этого я напишу:
Код 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 (только внутри данного класса).


Цитата:

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

sampo 26.01.2013 23:59

Цитата:

Сообщение от gloomyBrain (Сообщение 1117978)
Отриньте все сомнения. Модификаторы доступа не могут быть "лучше" или "хуже". Каждый из них хорош тогда, когда уместен.

при чем тут ерунда,плохая практика использовать максимально много модификаторов private?

gloomyBrain 27.01.2013 00:07

А вот я возьму, и не буду отвечать на ваш вопрос =) Потому что к теме он не относится.

PS
Ну ладно, отвечу. Ну, скажем, практика странная. Потому что модификаторов доступа больше 2, более того в ActionScript мы имеем возможность объявлять свои собственные пространства имен (считай, те же модификаторы доступа). А вы почему-то говорите что private - самый лучший. А я вот не согласен.


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

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