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

Pasha L 16.07.2007 16:18

Вопрос про классы
 
Здравствуйте. Вопрос про классы.
Есть два класса: A и B.
Код:

class A {
    var x,y,z:Number;
    function A(){
        x=0;
        y=0;
        z=0
    }
}
class B {
    var Av:A;
    function B(FAv:A){
        Av=FAv;
    }
    function catch(){
        trace("catched");
    }
}

При создании объекта класса B указывается ссылка на объект класса A.Необходимо, чтобы по изменению переменных внутри Av через B (B.Av.x=5, к примеру) вызывалась функция catch.

Дополнительная информация:
Можно, конечно же, создать ссылку внутри A на B, создать в A свойства и при set этого свойства выполнять, к примеру, Bv.catch. Но так не хотелось бы делать, потому что у меня не обязательно A связан с B, но обязательно B связан с A, а значит, хотелось бы свой "замысел" осуществить из B.

WindWalker 16.07.2007 22:02

А если сделать в B метод setAv ?
И в нём уже реализовать всё, что надо?

etc 16.07.2007 22:57

Геттеры и сеттеры в помощь.

iNils 16.07.2007 23:12

1. Вам надо срочно пересмотреть подход к названию переменных. Названия а-ля A.b.Av.Bv.e.vB.dA.xE сразу выключают в голове логический блоки. В название должны быть видно, что отражает переменная, если x,y,z понятно, то Av не несет в себе ни какой информативной нагрузки.
2. В большой быквы пишут только имена классов или констант (но там все с больщой буквы), а все останое начинаетс с маленькой. Поэтому переменных Av и FAv быть не может.
3. catch не может быть именем функции, это зарезервированное слово
4. Вам надо смотреть в сторону слушателей, то есть в B подписаться на события в A, а из А при изменении состояния переменной, рассылать события зарегистрированным слушателям.

Pasha L 17.07.2007 03:22

iNils,
Спасибо за советы. Извините, если мой код неудобен для вашего восприятия. Но вы говорите здесь не по теме - я не просил учить меня программированию. Умею и сам поучить могу, если есть необходимость.

Вместо catch может быть что угодно - это, что, я думаю, очевидно, не принципиально.

А теперь по теме, насчет классов в AS:
Как именно использовать геттеры и сеттеры? Не придется ли мне ставить,к примеру, три пары гет-сет в B (на Av.x (или как вам удобнее называть эту переменную, iNils) Av.y и Av.z)? Как именно организовать это дело, подскажите.

Хотел бы подчеркнуть, то что указал в первом посте темы: я знаю, что можно сделать ссылку в A на B (как будто, на родитель), и с помощью сеттера при присваивании значений свойствам x, y или z объекта класса A посылаать надлежащие посылки по ссылке на B. Но хотелось бы осуществить свою задумку, не затрагивая структуру класса A, а работая только со структурой B.

etc 17.07.2007 10:20

Ну если вы знаете, как программировать, то тогда вы можете сделать все самостоятельно.

CorC 17.07.2007 10:21

Цитата:

Сообщение от Pasha L
Не придется ли мне ставить,к примеру, три пары гет-сет в B (на Av.x (или как вам удобнее называть эту переменную, iNils) Av.y и Av.z)?

Из-за этого набора букв, действительно, как говорил iNils, ничего не понятно, даже в вашей цитате. А что плохого в нескольких геттерах?

Pasha L 17.07.2007 13:35

__etc, умение программировать и знание языка программирования - разные вещи. Я думаю, что заметно, что iNils несколько отошел от темы в своем посте №4.

Так. Значит. CorC предлагает так? (я изменил _специально_ некоторые имена, чтобы участвующим в теме было легче его воспринимать)

Код:

class Class1 {
    private var xVariable,yVariable,zVariable:Number;
    private var class2Variable:Class2;
    function Class1(argumentOfClass2:Class2){
        class2Variable=argumentOfClass2;
        xVariable=0;
        yVariable=0;
        zVariable=0;
    }
    public function set x(argument:Number){
        xVariable=argument;
        class2Variable.theFunctionINeedToCall();
    }
    public function set y(argument:Number){
        yVariable=argument;
        class2Variable.theFunctionINeedToCall();
    }
    public function set z(argument:Number){
        zVariable=argument;
        class2Variable.theFunctionINeedToCall
    }
    public function get x(){
        return xVariable;
    }
    public function get y(){
        return yVariable;
    }
    public function get z(){
        return zVariable;
    }
}
class Class2 {
    var class1Variable:Class1;
    function Class2(argumentOfClass1:Class1){
        class1Variable=argumentOfClass1;
    }
    function theFunctionINeedToCall(){
        trace("called");
    }
}

Код программы:
var objectOfClass1:Class1;
var objectOfClass2:Class2;
objectOfClass1=new Class1(objectOfClass2);
objectOfClass2=new Class1(objectOfClass1);
objectOfClass1.x=5;

Да, это одно из решений проблемы. Но я повторюсь: хотел бы решить свою задачу, не затрагивая структуры класса Class1 (оставив в нем только переменные x, y, z, не задействовав переменную class2Variable и не задействовав гет-сеты в Class1)

lowka 17.07.2007 17:12

Первый:
Код:

import mx.events.EventDispatcher;

class A
{
        private var dispatchEvent:Function;
       
        public var addEventListener:Function;
        public var removeEventListener:Function;

        private var _myProperty:Number;
       
        /**
        * Конструктор.
        */
        public function A()
        {
                EventDispatcher.initialize(this);
        }

        /**
        * Свойство.
        */
        public function set myProperty(value:Number)
        {
                this._myProperty = value;
                this.dispatchEvent({type:"change"});
        }
       
        public function get myProperty():Number
        {
                return this._myProperty;
        }
}

Второй:
Код:

import mx.utils.Delegate;
import A;

class Example
{
        private var _a:A;
       
        /**
        * Конструктор.
        */
        public function Example()
        {

        }
       
        /**
        * Свойство. Используемый экземпляр класса A.
        */
        public function set a(value:A):Void
        {
                if(value)
                {
                        this._a = value;
                        this._a.addEventListener("change", Delegate.create(this, this.changeHandler));
                }
        }
       
        public function get a():A
        {
                return this._a;
        }

        /**
        * Метод. Обработчик события, вызываемого при изменении свойства myProperty объекта a.
        */
        private function changeHandler(event:Object):Void
        {
                trace("changed");
        }
       
}

Пример:
Код:

import A;
import Example;

var a:A = new A();
var example:Example = new Example();
example.a = a;
a.myProperty = 10; // trace: "changed"


Pasha L 17.07.2007 20:20

Cпасибо. Буду втыкать :)


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

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