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

treety 17.03.2010 18:05

Ссылка на объект другого класса
 
Как классу передать ссылку на объект содержащийся в другом классе?

не то чтобы:
Код AS3:

class AClass {
        var a_object:Object;
        function AClass (){
                ...
        }
}

Код AS3:

import AClass;
class BClass{
        function BClass {
                var obj = {b:1};
                AClass.a_object = obj;//т.е. как обойтись без такой записи?
        }
}

а как это сделать если BClass даже и не знает AClass..где он и что он..
другими словами как сослаться на a_object?
зы. объяснил конечно криво..но как смог

Obi 17.03.2010 18:36

А вы, простите, на какой версии языка писать пытаетесь?

treety 17.03.2010 18:53

Цитата:

Сообщение от Obi (Сообщение 893720)
А вы, простите, на какой версии языка писать пытаетесь?

судя по ветке форму - AS3
или я что то не так написал в коде?

etc 17.03.2010 20:51

А написали в лучшем случае AS2-код.

expl 17.03.2010 21:28

Вы бы ситуацию, в которой возникает такая необходимость описали,
т.к. тут подходят советы начиная "Раз BClass не знает о AClass - то путь AClass сам возьмет это значение" и заканичивая рассылкой собитий и инверсией контроля =).

treety 17.03.2010 23:26

Цитата:

А написали в лучшем случае AS2-код.
ну я не стал заморачиваться на AS3 форматирование
схема же понятна..вроде..=)
Цитата:

Вы бы ситуацию, в которой возникает такая необходимость описали,
т.к. тут подходят советы начиная "Раз BClass не знает о AClass - то путь AClass сам возьмет это значение"...
в данном случае не хотелось бы чтобы AClass брал сам значение
тк. значение может динамически меняться и взятое AClass'ом значение
может случиться не актуальным
Цитата:

...и заканичивая рассылкой собитий и инверсией контроля =).
ухх..это для меня вообще тёмный лес =)

вобщем ситуация такая
я хочу записать параметр в объект который расположен в другом классе
(в моём примере конечно объект полностью перезаписывается,
но суть думаю понятна)
причём не должно иметь значение имя класса и пр.
пример: класс получил ссылку куда записывать какой-либо результат
и по этой ссылке он собственна и записывает его
без указания и импорта конкретного класса

у меняже получалось что вместо ссылки класс получал экземпляр объекта
..или как там правильно..

Obi 18.03.2010 10:40

Код AS3:

class A {}
 
class B {
  private var _a:A;
  public function B(a:A) {
      _a = a;
  }
}
 
var a:A = new A();
var b:B = new B(a);


treety 18.03.2010 14:27

Цитата:

Сообщение от Obi (Сообщение 893881)
Код AS3:

class A {}
 
class B {
  private var _a:A;
  public function B(a:A) {
      _a = a;
  }
}
 
var a:A = new A();
var b:B = new B(a);


но при такой записи всё равно нужно будет импортировать класс A в класс B
иначе: "Type was not found or was not a compile-time constant: A"
попробую немного по другому объяснить

Код AS3:

class A {
        var a_object:Object;
        function A (){
                a_object = {val_1:true, val_2:20, val_3:aClassFunction};
                //для примера объект содержит всякую всячину..
        }
        function aClassFunction (){}
}
 
class B{
        var b_object:Object;
        function B (){
                b_object = {val_1:false, val_2:-10};
}        }
 
//!!в класс Main никакой из выше описанных классов не импортируется
class Main{
        var main_boolean:Boolean;
        var main_number:Number;
        function Main (ссылка_на_объект_1, ссылка_на_объект_2){
 
                main_boolean = ссылка_на_объект_1.a_object.val_1;
                //для примера как мне считать из класса A значение a_object.val_1?
 
                main_number = 50;
                ссылка_на_объект_2.b_object.val_2 = main_number;
                //и для примера как мне записать значение
                //main_number в объект b_object.val_2 класса B?
}        }
 
var tmp:Main = new Main (ссылка_на_объект_1, ссылка_на_объект_2);
//так вот как этот "код" написать так чтобы он работал?


Котяра 18.03.2010 15:25

Цитата:

main_boolean = ссылка_на_объект_1.a_object.val_1;
//для примера как мне считать из класса A значение a_object.val_1?
Код AS3:

main_boolean = ссылка_на_объект_1["a_object"]["val_1"];

тольько плохо это - могут возникнуть ошибки времени выполнения и читают не из класса , а из объекта(экземпляра) класса
если не хотите импортировать СlassB в Main (например если СlassB - объект из другой swf)
используйте интерфейсы
Код AS3:

class Main{
        var main_boolean:Boolean;
        var main_number:Number;
        function Main (objA:IAClass, objB:IBClass){
..
}

соответственно
Код AS3:

 AClass implements IAClass
BClass implements IBClass


treety 18.03.2010 15:44

надо запробовать вариант

но тут вопрос в другом
в данном примере передаются объект/переменные/и тп.:
Код AS3:

var tmp:Main = new Main (объект_1, объект_2);

а мне нужно чтобы в Main они были именно ссылками..

те. такая запись работает
Код AS3:

main_boolean = ссылка_на_объект_1["a_object"]["val_1"];

но как мне передать именно ссылку на объект, а не объект в "ссылка_на_объект_1"?

Obi 18.03.2010 16:23

Лучше скажите зачем вам это нужно, а то вынос мозга какой-то получается.

treety 18.03.2010 16:30

Цитата:

Сообщение от Obi (Сообщение 893960)
Лучше скажите зачем вам это нужно, а то вынос мозга какой-то получается.

ну мне нужно чтобы класс самостоятельно записывал результат какой либо обработки
например по ссылке на объект или переменную
..и чтобы не имело значение в какой класс конкретно..

допустим есть класс "умножения"
ему дали числа и ссылку на то куда вернуть результат
он на умножал что нужно и положил туда куда сказали
вот и всё

Котяра 18.03.2010 16:34

Цитата:

но как мне передать именно ссылку на объект, а не объект в "ссылка_на_объект_1"?
ссылка будет полюбому, кроме ссылки вы никак объект не передадите
Код AS3:

public function multiplier(a:int,b:int,resObject:Object):void
{
resObject["result"] =a*b;
}


Obi 18.03.2010 16:41

> допустим есть класс "умножения"
> ему дали числа и ссылку на то куда вернуть результат

Пусть результат возвращает метод. Откуда вызываете, там и распоряжайтесь результатом.

Котяра 18.03.2010 16:52

ну умножение скорей всего для примера.
вот другой вариант двинуть объект в точку x,y,
Код AS3:

public function moveHero(x:int,y:int,hero:DisplayObject):void
{
// например проверяем на препятствие
if (isValidPoint(x,y))
{
hero.x=x;
hero.y=y;
}
}


treety 18.03.2010 17:03

Вложений: 1
Цитата:

Пусть результат возвращает метод. Откуда вызываете, там и распоряжайтесь результатом.
как это выглядит?

Цитата:

ну умножение скорей всего для примера.
вот другой вариант двинуть объект в точку x,y,
ну тут нету взаимодействия двух классов каким оно нужно..

Вложение 24042
в аттаче пример который нужно заставить работать..

Котяра 18.03.2010 19:11

нужно кому?
выложите код проблемного места в виде текста. качать аттач не буду.

treety 18.03.2010 19:55

Код AS3:

package{
        import flash.display.MovieClip;
        import Multiply;
        public class Main extends MovieClip {
                var _a;
                var _b;
                var res;
                function Main () {
                        res = 0;
                        _a = 20;
                        _b = 40;
                        var mlt = new Multiply ({val_1:_a, val_2:_b}, res, multiplyComplit);
                }
                public function multiplyComplit() {
                        trace (res);
                        //а должно быть 800!
                        //как записать результат умножения из Multiply в переменную res??
                }
        }
}
 
package{
        public class Multiply{
                var _towrite;
                var _callback;
                function Multiply (toread, towrite , callback) {
                        var reslt = toread.val_1*toread.val_2;
                        towrite = reslt;
                        callback ();
                }
        }
}


Obi 18.03.2010 20:34

Код AS3:

package{
        import flash.display.MovieClip;
        import Multiply;
        public class Main extends MovieClip {
                var _a;
                var _b;
                var res;
                function Main () {
                        res = 0;
                        _a = 20;
                        _b = 40;
                        var mlt = new Multiply ({val_1:_a, val_2:_b}, res, multiplyComplit);
                }
                public function multiplyComplit(result) {
                      res = result;
                        trace (res);
                        //а должно быть 800!
                        //как записать результат умножения из Multiply в переменную res??
                }
        }
}
 
package{
        public class Multiply{
                var _towrite;
                var _callback;
                function Multiply (toread, towrite , callback) {
                        var reslt = toread.val_1*toread.val_2;
                        callback.apply(null, reslt);
                }
        }
}

В классе Multiply переменная towrite хранит ссылку на значение переменной(а не на переменную) res в классе Main, следовательно при присвоении значения towrite вы просто присваиваете значение переменной towrite, не затрагивая переменную res и ее значение.

И почему вы так не любите типизацию? Это же удобно.

treety 18.03.2010 21:11

Цитата:

В классе Multiply переменная towrite хранит ссылку на значение переменной(а не на переменную) res в классе Main, следовательно при присвоении значения towrite вы просто присваиваете значение переменной towrite, не затрагивая переменную res и ее значение.
вот оно оно!!! =)
..именно те слова которые я пытался с самого начала поста донести
возможно ли результат передавать не с функцией а по ссылке на переменную?
Код AS1/AS2:

И почему вы так не любите типизацию? Это же удобно.

ну типизацией я потом займусь
мне сейчас важнее принцип..

Obi 18.03.2010 21:14

Цитата:

Сообщение от treety (Сообщение 894058)
вот я и хочу узнать как мне передать ссылку на переменную а не на значение
можете рассказать?

Мой кусок кода работает. Ну должен, по крайней мере. Если вы заметили, в исправленном мной варианте вызывается переданная в параметре функция, которой в качестве параметра передается результат. Она и записывает результат в нужную вам переменную.

expl 18.03.2010 21:35

Код AS3:

class Link
{
    public var target:TypeOfLinkedObject
}

Вот эту ссылку и передаём и из нее и читаем:)

treety 18.03.2010 22:27

Цитата:

Мой кусок кода работает. Ну должен, по крайней мере. Если вы заметили, в исправленном мной варианте вызывается переданная в параметре функция, которой в качестве параметра передается результат. Она и записывает результат в нужную вам переменную.
да
кусок работает
но функция callback была для примера
а если у меня будет, скажем, тысяча переменных
то для них писать тысячу функций?
если бы вопрос стоял в том как с помощью функции передать
то тогда да..тот пример - то что нужно
но всё таки я хочу получить прямую ссылку на переменную
или это не возможно?

Цитата:

Вот эту ссылку и передаём и из нее и читаем
не представляю как она должна работать..
я просто в АС3 не настолько шарю.. =(

Котяра 18.03.2010 23:36

простые типы Number,int,String передаются по значению
все остальные по ссылке - но не по адресу
так
Код AS3:

function test(o:object)
{
o=null;// на самом деле зануляется локальная переменная o
}
function test2(o:object)
{
o.x=null;
}
var o:Object ={x:1}
test(o);
trace(o.x) // =1;
test2(o);
trace(o.x) //null;// исправлено


etc 19.03.2010 08:06

Цитата:

Сообщение от Котяра (Сообщение 894100)
простые типы Number,int,String передаются по значению
все остальные по ссылке - но не по адресу
так
Код AS3:

function test(o:object)
{
o=null;// на самом деле зануляется локальная переменная o
}
function test2(o:object)
{
o.x=null;
}
var o:Object ={x:1}
test(o);
trace(o.x) // =1;
test2(o);
trace(o.x) // ERROR 1009;


1009? Да ну, а я думал, что null.

Котяра 19.03.2010 10:50

Цитата:

Сообщение от etc (Сообщение 894134)
1009? Да ну, а я думал, что null.

недокопипастил
Код AS3:

function test(o:Object)
{
o=null;// на самом деле зануляется локальная переменная o
}
function test2(o:Object)
{
o.x=null;
}
var o:Object ={x:1}
test(o);
trace(o.x) // =1;
test2(o);
trace(o.x) // null;
o=null;
trace(o.x)//error 1009;


treety 19.03.2010 13:38

тут то понятно
эти переменные в одной области видимости находяцца
ну а как между классами ссылки передавать?
и вообще возможно ли это?

expl 19.03.2010 23:12

а чем плоха ссылка в посте 22?

А если нужна "прозрачность" работы со ссылкой - т.е. чтобы было пофиг объект это Link или объект типа TypeOfLink,
делают обертку типа TypeOfLink и делегируют в каждом методе управление в link:
Код AS3:

class MyClassWrapper extends/implements MyClass
{
  public var implementer:MyClass//лучше сеттер-геттер, конечно
 
  public function method0(value0):SomeType
  {
        return implementer.method0(value0);
    }
 
    public function method1(value1):Void
    {
        implementer.mehod1(value1)
    }
    ...
}

Все - объект можно подменять прозрачно для клиента

Добавлено через 13 минут
Код AS3:

_myLink.target == null
if (_myLink.target != null)
{
    ....
}

Один фиг - не напрямую с объектом работаем

treety 23.03.2010 19:30

Цитата:

а чем плоха ссылка в посте 22?
так как пользоваться этим "target"?
я просто так и не разобрался..

пока экспериментировал с таргетом
у меня в итоге получилась такая схема:
Код AS3:

package{
        import flash.display.MovieClip;
        import Multiply;
        public class Main extends MovieClip {
                var _a;
                var _b;
                var res;
                function Main () {
                        res = 0;
                        _a = 20;
                        _b = 40;
                        var mlt = new Multiply ({val_1:_a, val_2:_b}, {dest:this, nam:"res"}, multiplyComplit);
                }
                public function multiplyComplit() {
                        trace (res);
                }
        }
}
 
package{
        public class Multiply{
                var _towrite;
                var _callback;
                function Multiply (toread, towrite , callback) {
                        var reslt = toread.val_1*toread.val_2;
                        towrite.dest[towrite.nam] = reslt;
                        callback ();
                }
        }
}



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

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