Просмотр полной версии : переопределение имени объекта у потомков. Как?
flax4Noob
11.01.2011, 07:16
Доброе время суток.
Делаю кнопочки (для интерфейса)
Кнопочки будут разные, поэтому разные классы... и тут у меня проблемка. На кнопках рисуются картинки - иконки. Разумеется, для разных кнопок они разные. Для "ОК" это зеленая галочка, для "Отмена" - красный крестик. Но поведение у них одинаковое. Поэтому я делаю класс baseButton и там делаю вот так:
[Embed(source="imgEmpty.png")]
private var imgEmpty:Class;
internal var img:BitmapAsset;
далее, после ADDED_TO_STAGE у меня в базовом классе общий для всех кнопачек способ рисования, в котором
img = new imgEmpty() as BitmapAsset;
и понеслося....
Внимание, вопрос:
как у потомков этой кнопки сделать другие картинки? Вынести бы имя картинки в свойство, вроде такого:
public var iconName:String()="imgEmpty";
и сделать для него геттер, сеттер... но как создать в этом языке объект с имянем из переменной?
img = new iconName() as BitmapAsset;
не пашет, разумеется. никакого eval я не нашел. Что делать? Гуглю покачта.... ибо затык((
Сорри, если вопрос нубский. Во флеше 11й день)
А не приходило в голову что-то типа
[Embed(source="imgOK.png")]
private var imgOK:Class;
[Embed(source="imgCancel.png")]
private var imgCancel:Class;
var buttonOK:CustomButton = new CustomButton(new imgOK, "OK");
buttonOK.addEventListener(MouseEvent.CLICK, onClickOK);
var buttonCancel:CustomButton = new CustomButton(new imgCancel, "Отмена");
buttonCancel.addEventListener(MouseEvent.CLICK, onClickCancel);
.....
public class CustomButton extends Sprite
{
public function CustomButton (icon:Bitmap, label:String)
Можно сделать разные img1 - галка img2 - крестик.
При вызове baseButton("img1"); ну и соответсвенно в классе
[Embed(source="imgEmpty.png")]
private var img1:Class;
[Embed(source="imgEmpty2.png")]
private var img2:Class;
internal var img:BitmapAsset;
function baseButton(imgn:String){
img = new this[imgn]();
}
public var iconName:String()="imgEmpty";
А такое разве не вызовет ошибки? Типизация половинчатым конструктором.
flax4Noob
11.01.2011, 10:04
Да там все вызывает ошибки, что после вопроса. Ибо это то как я "очень хочу" сделать.
img = new this[imgn]();
вот это - интересная тема. Она позволит мне сделать так?
[
class btnOK extends baseButton {
Embed(source="imgOK.png")]
private var img:Class;
....
}
и
class btnCancel extends baseButton {
Embed(source="imgCancel.png")]
private var img:Class;
....
}
Разумеется в разных файлах....
Суть затеи в том чтобы у потомков переопределить картинку, оставив название переменной прежним (как у baseButton. Это позволяет мне делать ее черно-белой и цветной при наведении мышки в базовом класе =)
В идеале, конечно, позволить указывать название картинки и подгружать его из библиотеки какой-то. Но я еще недораскурил библиотеки настолько.=(
cleptoman
11.01.2011, 11:41
вы цементируете в своих кнопках ассеты и пытаетесь сделать это все гибким..послушайте Wolsh и сделайте один класс для кнопок и передавайте ваши ассеты для них извне.
JackFromChaos
11.01.2011, 12:49
public class BaseButton extends Sprite
{
///Картинка по умолчания, отоброажается если в конструктор передан null
[Embed(source="imgEmpty.png")]
private var _defaultImg:Class;
///Текущий класс картинки
private var _imgClass:Class;
///Экземпляр текущей картинки
protected var _img:DisplayObject = null;
public function BaseButton(pImgClass:Class=null)
{
if (pImgClass == null)
pImgClass = _defaultImg;
this.imgClass = pImgClass;
}
public function get imgClass():Class
{
return _imgClass;
}
//Свойство imgClass можно менять в любой момент, меняя тем самым внешний виду кнопочки
public function set imgClass(value:Class):void
{
if (_img)
removeChild(_img);
_imgClass = value;
_img = new _imgClass() as DisplayObject;
addChild(_img);
}
}
Теперь мы можем менять внешний вид кнопки когда нам заблагорассудится. А так же можем задавать внешний вид, создавая новые классы, например:
public class BtnCancel extends BaseButton
{
Embed(source="imgCancel.png")]
private var btnOk:Class;
public ButtonOk()
{
super(btnOk);
}
}
Извините, конечно, но что означает эта строка в таком синтаксисе?
[Embed(source="imgEmpty.png")]
Встраивание файла в библиотеку (при компиляции с flex sdk).
Объявленная следом переменная типа Класс будет хранить ссылку на кастомный класс, автоматически создаваемый для данного элемента библиотеки.
Добрые люди разделяют логику (поведение) и внешний вид компонентов.
Она позволит мне сделать так?
Да, позволит
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.