Просмотр полной версии : Ссылка на объект другого класса
Как классу передать ссылку на объект содержащийся в другом классе?
не то чтобы:
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?
зы. объяснил конечно криво..но как смог
А вы, простите, на какой версии языка писать пытаетесь?
А вы, простите, на какой версии языка писать пытаетесь?
судя по ветке форму - AS3
или я что то не так написал в коде?
А написали в лучшем случае AS2-код.
Вы бы ситуацию, в которой возникает такая необходимость описали,
т.к. тут подходят советы начиная "Раз BClass не знает о AClass - то путь AClass сам возьмет это значение" и заканичивая рассылкой собитий и инверсией контроля =).
А написали в лучшем случае AS2-код.
ну я не стал заморачиваться на AS3 форматирование
схема же понятна..вроде..=)
Вы бы ситуацию, в которой возникает такая необходимость описали,
т.к. тут подходят советы начиная "Раз BClass не знает о AClass - то путь AClass сам возьмет это значение"...
в данном случае не хотелось бы чтобы AClass брал сам значение
тк. значение может динамически меняться и взятое AClass'ом значение
может случиться не актуальным
...и заканичивая рассылкой собитий и инверсией контроля =).
ухх..это для меня вообще тёмный лес =)
вобщем ситуация такая
я хочу записать параметр в объект который расположен в другом классе
(в моём примере конечно объект полностью перезаписывается,
но суть думаю понятна)
причём не должно иметь значение имя класса и пр.
пример: класс получил ссылку куда записывать какой-либо результат
и по этой ссылке он собственна и записывает его
без указания и импорта конкретного класса
у меняже получалось что вместо ссылки класс получал экземпляр объекта
..или как там правильно..
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);
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);
//так вот как этот "код" написать так чтобы он работал?
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
надо запробовать вариант
но тут вопрос в другом
в данном примере передаются объект/переменные/и тп.:
var tmp:Main = new Main (объект_1, объект_2);
а мне нужно чтобы в Main они были именно ссылками..
те. такая запись работает
main_boolean = ссылка_на_объект_1["a_object"]["val_1"];
но как мне передать именно ссылку на объект, а не объект в "ссылка_на_объект_1"?
Лучше скажите зачем вам это нужно, а то вынос мозга какой-то получается.
Лучше скажите зачем вам это нужно, а то вынос мозга какой-то получается.
ну мне нужно чтобы класс самостоятельно записывал результат какой либо обработки
например по ссылке на объект или переменную
..и чтобы не имело значение в какой класс конкретно..
допустим есть класс "умножения"
ему дали числа и ссылку на то куда вернуть результат
он на умножал что нужно и положил туда куда сказали
вот и всё
но как мне передать именно ссылку на объект, а не объект в "ссылка_на_объект_1"?
ссылка будет полюбому, кроме ссылки вы никак объект не передадите
public function multiplier(a:int,b:int,resObject:Object):void
{
resObject["result"] =a*b;
}
> допустим есть класс "умножения"
> ему дали числа и ссылку на то куда вернуть результат
Пусть результат возвращает метод. Откуда вызываете, там и распоряжайтесь результатом.
ну умножение скорей всего для примера.
вот другой вариант двинуть объект в точку x,y,
public function moveHero(x:int,y:int,hero:DisplayObject):void
{
// например проверяем на препятствие
if (isValidPoint(x,y))
{
hero.x=x;
hero.y=y;
}
}
Пусть результат возвращает метод. Откуда вызываете, там и распоряжайтесь результатом.
как это выглядит?
ну умножение скорей всего для примера.
вот другой вариант двинуть объект в точку x,y,
ну тут нету взаимодействия двух классов каким оно нужно..
24042
в аттаче пример который нужно заставить работать..
нужно кому?
выложите код проблемного места в виде текста. качать аттач не буду.
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 ();
}
}
}
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 и ее значение.
И почему вы так не любите типизацию? Это же удобно.
В классе Multiply переменная towrite хранит ссылку на значение переменной(а не на переменную) res в классе Main, следовательно при присвоении значения towrite вы просто присваиваете значение переменной towrite, не затрагивая переменную res и ее значение.
вот оно оно!!! =)
..именно те слова которые я пытался с самого начала поста донести
возможно ли результат передавать не с функцией а по ссылке на переменную?
И почему вы так не любите типизацию? Это же удобно.
ну типизацией я потом займусь
мне сейчас важнее принцип..
вот я и хочу узнать как мне передать ссылку на переменную а не на значение
можете рассказать?
Мой кусок кода работает. Ну должен, по крайней мере. Если вы заметили, в исправленном мной варианте вызывается переданная в параметре функция, которой в качестве параметра передается результат. Она и записывает результат в нужную вам переменную.
class Link
{
public var target:TypeOfLinkedObject
}
Вот эту ссылку и передаём и из нее и читаем:)
Мой кусок кода работает. Ну должен, по крайней мере. Если вы заметили, в исправленном мной варианте вызывается переданная в параметре функция, которой в качестве параметра передается результат. Она и записывает результат в нужную вам переменную.
да
кусок работает
но функция callback была для примера
а если у меня будет, скажем, тысяча переменных
то для них писать тысячу функций?
если бы вопрос стоял в том как с помощью функции передать
то тогда да..тот пример - то что нужно
но всё таки я хочу получить прямую ссылку на переменную
или это не возможно?
Вот эту ссылку и передаём и из нее и читаем
не представляю как она должна работать..
я просто в АС3 не настолько шарю.. =(
простые типы 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;// исправлено
простые типы 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.
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;
тут то понятно
эти переменные в одной области видимости находяцца
ну а как между классами ссылки передавать?
и вообще возможно ли это?
а чем плоха ссылка в посте 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)
{
....
}
Один фиг - не напрямую с объектом работаем
а чем плоха ссылка в посте 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 ();
}
}
}
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.