Сверху головы я могу предложить вам несколько решений, в зависимости от вашего определения «аккуратный».Я полагаю, что «самое подходящее» - это отправка события.Но я обрисую в общих чертах все три:
1. Сам ярлык должен быть диспетчером событий или каким-либо объектом, который может уведомить все, что «помечено», своим конкретным значением.Конечно, это можно рассматривать как вариант решения № 3, но это НЕТ.Ваши кнопки будут регистрировать слушателей на назначенной им метке, и, сделав операцию изменения метки, отправит событие изменения, ваши кнопки получат возможность обновить отображение своей метки.Это удобно, потому что вы можете иметь многократно используемый шаблон программирования:дорожка кнопок с одинаковой меткой в контейнере, которая легко перебирается, например, словарь (нужны слабые клавиши, чтобы вектор не подходил!)
class Button
{
static var buttons_by_label: Dictionary;
static function init_class()
{
buttons_by_label = new Dictionary(true);
}
static function reset_identical_labels(old_value: String, new_value: String)
{
if(buttons_by_label[old_value] === undefined)
{
throw new Error("No buttons with specified label value.");
}
for(var button: Button in buttons_by_label[old_value])
{
button.label = new_value;
}
}
var label_tf: TextField;
public function Button(label: String)
{
this.label = label;
}
public function get label()
{
return label_tf.text;
}
public function set label(new_value: String)
{
var old_value: String = label_tf.text;
if(buttons_by_label[old_value] !== undefined)
{
delete buttons_by_label[old_value][this];
}
if(buttons_by_label[new_value] === undefined)
{
buttons_by_label[new_value] = new Dictionary(true);
}
buttons_by_label[new_value][this] = true;
label_tf.text = new_value;
}
}
Button.init_class();
var button1 = new Button("Cancel");
var button2 = new Button("Cancel");
var buttonN = new Button("Cancel");
Button.reset_identical_labels("Cancel", "Anular");
3.Используйте преимущества списка отображенияиерархия и модель потока событий, чтобы Flash Player выполнял большую часть работы за вас:
class Button
{
var label_tf: TextField;
public function Button(label: String)
{
this.label = label;
stage.addEventListener("request.button.update_label",
on_update_label_request_event,
false, 0,true);
}
public function get label()
{
return label_tf.text;
}
public function set label(new_value: String)
{
label_tf.text = new_value;
}
function on_update_label_request_event(event: LabelUpdateRequestEvent)
{
if(label == event.old_value)
{
label = event.new_value;
}
}
}
class LabelUpdateRequestEvent extends Event
{
public var old_value: String;
public var new_value: String;
public function LabelUpdateRequestEvent(old_value: String, new_value: String)
{
super("request.button.update_label");
this.old_value = old_value;
this.new_value = new_value;
}
}
var button1 = new Button("Cancel");
var button2 = new Button("Cancel");
var buttonN = new Button("Cancel");
stage.dispatchEvent(new LabelUpdateRequestEvent("Cancel", "Anular"));
Я предлагаю вам изучить слабые и сильные стороны каждого из них - все они имеют и то и другое - и использоватьгибридное решение.Первый имеет эффект разделения значения метки со ссылкой на значение, то есть два разных объекта метки, оба с «Отмена», поскольку значение НЕ будет изменять друг друга, даже если метка фактически идентична.Два других решения не отделяют значение от ссылки.Однако с ними вы получаете дополнительную плату за добавление слишком большого числа слушателей событий с большим количеством кнопок, чего не может сделать второе решение.Это все было в моей голове, но у вас есть интересная проблема, используйте вашу фантазию сейчас: -)