Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Непонятное рядом. Это что , глюки флэша ? Проблеммы с геттером. (http://www.flasher.ru/forum/showthread.php?t=70451)

-=VoskreS=- 14.10.2005 21:45

Непонятное рядом. Это что , глюки флэша ? Проблеммы с геттером.
 
Вложений: 1
Есть три класса, наследуются друг от друга.

Код:

//класс A
import com.B;

class com.A extends B
{
        public function A(){
        }

        public function f1( n )
        {
                _width = n;
        }
       
        public function get _width():Number
        {
                var w = super._width
                trace('A get _width '+w);
                return w
        }
       
       
        public function set _width(w:Number)
        {
                super._width = w
        }
       
}

//класс B

import com.C;

class com.B extends C
{
        public function B(){
        }
        /*
        public function get _width():Number
        {
                return super._width
        }*/
}

//класс С

class com.C
{
        private var _w:Number = 100;

        public function C(){
        }
       
        public function get _width():Number
        {
                //trace('C get _width '+(_w+1));
                return _w+1
        }
               
        public function set _width(w:Number)
        {
                _w = w
        }
}

//код в руте :

a = new com.A();

//a._width = 5;
trace( a._width );

Во первых, почему, если просто запустить то трейс из геттера распечатается один раз, а если раскомментарить строку из рута,то 3 раза ?

И самое интересное, почему, если расскомментарить промежуточный геттер в классе B (что по логике вещей вообще не должно нарушить работу программы, флэш при компиляции выдаст ошибку) :

Type mismatch in assignment statement: found Number where Function is required.
super._width = w

ps. в аттаче лежат эти 3 класса и флашник.

MaxLife 15.10.2005 15:27

После добавления сеттера в класс В ошибка пропала. Действительно, непонятное поведение - я вогнал в сеттеры дополнительные трейсы и получается, что после отработки сеттера кто-то коварно обращается к свойству - сразу же после сеттера срабатывает геттер... Чудны воды во облацех ))

7thsky™ 16.10.2005 14:31

а Вы посмотрите во что компилиться Ваш код, и сразу поймете :)

MaxLife 16.10.2005 14:47

И во что?

7thsky™ 16.10.2005 14:59

getter | setter

Код:

// property value
function get value ():Number {
return __value;
}
function set value (a:Number):Void {
__value = a;
}

после компиляции, если смотреть через декомпилятор
Код:

function __get__value () {
return __value;
}

function __set__value (val) {
__value = val;
return (__get__value ());
null;
}

что в принципе и понятно, потом так и работает addProperty (propertyName, getter, setter) в конец сеттера вставляется return (getter ());

MaxLife 16.10.2005 15:09

А зачем это, интересно - геттер в конец? Чтоб знать, что установилось?

-=VoskreS=- 17.10.2005 14:03

Кстати вроде стало понятно, почему сеттер в конце дергает геттер.
Это для того , чтоб, например, работал следующиий код :

trace( _width=5 ) , где _width - пропертя, на которую есть геттер и сеттер.

Смысл в том, что после присвоения ( отработал сеттер ) в качестве параметря для trace вернется значение геттера.

-=VoskreS=- 17.10.2005 14:07

Кстати, вы замечали, что иногда блок кода вида

Код:

        public function get _width():Number
        {
                return super._width;       
        }

имеет значение, т.е. без него не работает.Но почему ?


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

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