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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 01.06.2011, 22:47
Max360 вне форума Посмотреть профиль Отправить личное сообщение для Max360 Найти все сообщения от Max360
  № 1  
Ответить с цитированием
Max360
[+3 17.04.11]

Регистрация: Mar 2011
Сообщений: 168
По умолчанию Set - Get - методы

Здравствуйте. Проблема с сеттером.
Проблема №1.
Код AS3:
private var _mas:Array;
...
function set mas(new_mas):void{
     _mas = new_mas;
}
где-то вызываю:
Код AS3:
mas.push("Hello world!");
Set - метод не вызывается, т.к. вроде метод push добавляет новый элемент и возвращает новую длину массива.

Проблема №2.
Код AS3:
private var _mс:MovieClip;
...
function set mc(new_mc):void{
     _mc = new_mc;
}
где-то вызываю:
Код AS3:
mc.x = 0;
mc.y = 0;
Set - метод снова не срабатывает, т.к. сам мувиклип не изменяется.

Старый 01.06.2011, 22:52
Bgg вне форума Посмотреть профиль Отправить личное сообщение для Bgg Найти все сообщения от Bgg
  № 2  
Ответить с цитированием
Bgg
 
Аватар для Bgg

Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
Вы перепутали set и get. Не нужно ничего делать методом тыка, читайте: http://help.adobe.com/ru_RU/ActionSc...8a9b90204-7fcb

Старый 01.06.2011, 22:57
Max360 вне форума Посмотреть профиль Отправить личное сообщение для Max360 Найти все сообщения от Max360
  № 3  
Ответить с цитированием
Max360
[+3 17.04.11]

Регистрация: Mar 2011
Сообщений: 168
КАК ПЕРЕПУТАЛ? Справку я читал, и Мука читал ))) Сеттер вызывается при изменении свойства, т.е. когда ему присваивается новое значение, геттер когда нужно получить его значение. Как тут можно перепутать? Объясните пожалуйста.

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

Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
Как вам объяснить, если вы читать не умеете?
Код AS3:
private var _a:Array;
private function set a(value:Array):void{
  _a = value;
}
private function get a():Array{
  return _a;
}
//...
a = [0,1];//set
trace(a[0]);//get

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

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
Set - метод снова не срабатывает, т.к. сам мувиклип не изменяется
Вы уже ответили на свой вопрос. к массиву это тоже относится
__________________
...вселенская грусть

Старый 01.06.2011, 23:17
Max360 вне форума Посмотреть профиль Отправить личное сообщение для Max360 Найти все сообщения от Max360
  № 6  
Ответить с цитированием
Max360
[+3 17.04.11]

Регистрация: Mar 2011
Сообщений: 168
Bgg - чем мой код отличается от вашего???
gloomyBrain прав, сам мувик не изменяется, поэтому сеттер не срабатывает. Как мне выйти из этого положения, не буду ж я делать сеттер отдельно на каждый метод мувиклипа, как организовать событие о том что что-то в мувике изменилось?

Старый 01.06.2011, 23:39
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 7  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Цитата:
Сообщение от Bgg Посмотреть сообщение
Как вам объяснить, если вы читать не умеете?
Код:
private var _a:Array;
private function set a(value:Array):void{
  _a = value;
}
private function get a():Array{
  return _a;
}
//...
a = [0,1];//set
trace(a[0]);//get
.....

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

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
AS3, в отличие от других разновидностей ECMAScript, язык со статической типизацией, это значит, что если вы не указываете тип переменной, то для того, чтобы как-то сохранить соответствие с ECMA-стандартом, переменная объявляется со специальным типом, который заставит рантайм определять ее тип по ходу выполнения, а еще иногда и приводить к тому типу, который ему покажется подходящим в том или ином случае. Это нормальная практика в языках типа JavaScript / Lua и им подобных, где скорость не важна, и код, как правило состоит из одного-двух файлов. В AS3 типичный проект гораздо больше, чем типичный проект на JavaScript, кроме того, AS3 все-таки можно иногда использовать для более сложных рассчетов, поэтому не указывать тип переменных в AS3 - это очень плохая практика (т.как это одновременно ухудшает производительность равно как и контроль за тем, что происходит в проекте). Ни одна компания более-менее серьезно разрабатывающая на AS3 не будет использовать динамическую типизацию в своем коде.
Подчерки и знак доллара зарезервированы для использования в коде сгенерированным компилятором, поэтому, за очень редким исключением, от их использования лучше отказаться. Нормально использовать подчерки в названиях констант, приватных свойств, пространств имен и названиях слушателей событий, если вы хотите, чтобы они были похожи на названия которые генерирует компилятор. Но даже в этих случаях лучше найти вариант, где подчерки не нужны.

Что до вашего вопроса, то ОО, а именно объекты, в AS3 реализованы таким образом, что методы специализирующиеся на определенном типе объекта бывают двух видов, статические и привязаные к объекту, последние:
- объявляются "внутри" объявления класса этого объекта.
- автоматически получают переменную this со ссылкой на объект класса, на котором они специализируются.
В то время как статические являются по сути функциями помещенными в пространсвто имен объекта, на которм специализируются, но в полном смысле этого слова методами не являются.
Специальные функции get и set нужны для описания свойств объекта (они, так же как методы, могут быть статическими и привязанными к объекту). Статические специализируются не переменных в пространстве имен объекта на котором специализируются, привязанные - на переменных экземпляра класса на котором специализируются. Последние, так же как и методы, получают переменную this указывающую на объект, на котором они специализируются.
Это значит, что внутри сеттера или геттера вы можете обратится к другим полям объекта или его пространства имен. Геттер соответственно вызывается когда вы читаете из свойства с названием геттера, а сеттер при записи в это свойство. Например свойство массива length могло бы быть реализовано следующим образом:
Код AS3:
public class Array
{
    private var _length:uint;
    AS3 function get length():uint
    {
        return this._length;
    }
 
    AS3 function set length(value:uint):void
    {
        var add:uint;
        if (this._lenght != value)
        {
            if (this._length > value)
            {
                this.splice(this._length - value, -1 * (value - this._length));
            }
            else
            {
                add = value - this._length;
                while (add--) this.push(undefined);
            }
        }
        this._length = value;
    }
}
AS3 - название пространства имен в котором объявлены методы класса Array.
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 02.06.2011 в 01:50.
Старый 01.06.2011, 23:48
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 9  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
while (add--) this.push(undefined);
Эмм... Но ведь push будет менять длину? =)
__________________
...вселенская грусть

Старый 01.06.2011, 23:55
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 10  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Ну, это уже издержки производства (splice() тоже меняет) Кроме того, функция по-настоящему реализована не так, код только для наглядности, чтобы было видно, что свойсто поменялось, не реализовывать же весь функционал массива ради одного свойства .
__________________
Hell is the possibility of sanity

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

Теги
get-метод , set-метод

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

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


 


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


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