PDA

Просмотр полной версии : Вопрос про классы


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
Не придется ли мне ставить,к примеру, три пары гет-сет в 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пасибо. Буду втыкать :)

Pasha L
17.07.2007, 21:21
Так. Выдал ошибку:
There is no method with the name 'EventDispatcher'.
EventDispatcher.initialize(this);
Я заменил EventDispatcher на dispatchEvent. Ошибка больше не вылезает, но и ничего не выводится.

lowka
17.07.2007, 22:07
Пример рабочий. У вас EventDispatcher не импортирован(?), наверное.

iNils
18.07.2007, 00:50
Я думаю, что заметно, что iNils несколько отошел от темы в своем посте №4.Совет по теме был под пунктом 4. А 1-3 это не советы как вам прогроммировать (может хоть иероглифами переменные называть), а как сделать так, что бы приходя сюда задавать вопросы, вы быстрее бы получали на них ответы, многие увидя абракадабру в вашем коде, просто закроют тему, и вы со своим умением программировать, ответа можете и не дождаться.

PS. Модератор всегда по теме говорит :bye:

Pasha L
18.07.2007, 01:31
Пример рабочий. У вас EventDispatcher не импортирован(?), наверное.
Эмм. Наверное. А как его импортировать и откуда?