PDA

Просмотр полной версии : Ссылка на объект другого класса


treety
17.03.2010, 18:05
Как классу передать ссылку на объект содержащийся в другом классе?

не то чтобы:
class AClass {
var a_object:Object;
function AClass (){
...
}
}
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
А вы, простите, на какой версии языка писать пытаетесь?
судя по ветке форму - 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
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
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"
попробую немного по другому объяснить

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?

main_boolean = ссылка_на_объект_1["a_object"]["val_1"];
тольько плохо это - могут возникнуть ошибки времени выполнения и читают не из класса , а из объекта(экземпляра) класса
если не хотите импортировать СlassB в Main (например если СlassB - объект из другой swf)
используйте интерфейсы
class Main{
var main_boolean:Boolean;
var main_number:Number;
function Main (objA:IAClass, objB:IBClass){
..
}
соответственно
AClass implements IAClass
BClass implements IBClass

treety
18.03.2010, 15:44
надо запробовать вариант

но тут вопрос в другом
в данном примере передаются объект/переменные/и тп.:
var tmp:Main = new Main (объект_1, объект_2);
а мне нужно чтобы в Main они были именно ссылками..

те. такая запись работает
main_boolean = ссылка_на_объект_1["a_object"]["val_1"];
но как мне передать именно ссылку на объект, а не объект в "ссылка_на_объект_1"?

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

treety
18.03.2010, 16:30
Лучше скажите зачем вам это нужно, а то вынос мозга какой-то получается.
ну мне нужно чтобы класс самостоятельно записывал результат какой либо обработки
например по ссылке на объект или переменную
..и чтобы не имело значение в какой класс конкретно..

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

Котяра
18.03.2010, 16:34
но как мне передать именно ссылку на объект, а не объект в "ссылка_на_объект_1"?
ссылка будет полюбому, кроме ссылки вы никак объект не передадите
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,
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
Пусть результат возвращает метод. Откуда вызываете, там и распоряжайтесь результатом.
как это выглядит?

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

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

Котяра
18.03.2010, 19:11
нужно кому?
выложите код проблемного места в виде текста. качать аттач не буду.

treety
18.03.2010, 19:55
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
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 и ее значение.
вот оно оно!!! =)
..именно те слова которые я пытался с самого начала поста донести
возможно ли результат передавать не с функцией а по ссылке на переменную?
И почему вы так не любите типизацию? Это же удобно.
ну типизацией я потом займусь
мне сейчас важнее принцип..

Obi
18.03.2010, 21:14
вот я и хочу узнать как мне передать ссылку на переменную а не на значение
можете рассказать?

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

expl
18.03.2010, 21:35
class Link
{
public var target:TypeOfLinkedObject
}

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

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

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

Котяра
18.03.2010, 23:36
простые типы Number,int,String передаются по значению
все остальные по ссылке - но не по адресу
так
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
простые типы Number,int,String передаются по значению
все остальные по ссылке - но не по адресу
так
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
1009? Да ну, а я думал, что null.
недокопипастил
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:

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 минут
_myLink.target == null
if (_myLink.target != null)
{
....
}

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

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

пока экспериментировал с таргетом
у меня в итоге получилась такая схема:
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 ();
}
}
}