Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как из расширяемого класса вызвать метод или свойство расширяющего класса (http://www.flasher.ru/forum/showthread.php?t=140596)

markII 03.06.2010 05:57

Как из расширяемого класса вызвать метод или свойство расширяющего класса
 
Помогите пожалуйста, а то голову уже сломал.Увы....Мук мне не помог(((
Вот основной класс Init
Код AS3:

package{
        import flash.display.*;
        import flash.geom.*;
        import flash.events.*;
        import flash.utils.*;
 
        public class Init extends Sprite {
 
                public function Init() {
                        stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDoubleClick);
                }
 
                public function onMouseDoubleClick(e:MouseEvent) {
                                var rbox:RedBox = new RedBox(mouseX,mouseY);
                                addChild(rbox);
                        }
                }
        }
}

вот расширяемый класс MoveController
Код AS3:

package{
        import flash.display.*;
        import flash.geom.*;
        import flash.events.*;
 
        public class MoveController extends Sprite {
                public var  a:Number = 6;
 
                public function MoveController() {
                //что мне здесь нужно написать чтобы получить значение переменной c  метод для ее получения в этом классе?
                }
                public function onMousedown(e:MouseEvent):void {
                        e.stopPropagation()
                        e.target.startDrag();
                }
                public function onMouseup(e:MouseEvent):void {
                        e.stopPropagation()
                        e.target.stopDrag();
                }
        }
}

вот расширяющий класс RedBox
Код AS3:

package{
        import flash.display.*;
        import flash.geom.*;
        import flash.events.*;
 
        public class RedBox extends MoveController {
        public var c:Number = 276;
        private var bgColor:uint                      = 0xAE0D0D;
        private var borderColor:uint                  = 0x666666;
        private var borderSize:uint                  = 3;
        private var cornerWidth:uint                = 16;
        private var cornerHeight:uint                = 16;
 
                public function RedBox(x:Number,y:Number) {
                        trace(super(a));//Выписывает 6.По идее super вообще можно опустить
                        var child:Shape = new Shape();
                        child.name = "RedBox"+x;
                        child.graphics.beginFill(bgColor);
                        child.graphics.lineStyle(borderSize, borderColor);
                        child.graphics.drawRect(x, y, cornerWidth,cornerHeight);
                        child.graphics.endFill();
                        addChild(child);
                        this.addEventListener(MouseEvent.MOUSE_DOWN,onMousedown);
                        this.addEventListener(MouseEvent.MOUSE_UP,onMouseup);
                }
        }
}

Если я что -то делаю не так то поправьте меня пожалуйста:rolleyes:

wvxvw 03.06.2010 06:09

Прочитал несколько раз и не понял, что собственно нужно сделать...
Во втором случае trace(super(a)); не должно компилироваться, либо ошибка синтаксиса должна быть, либо несоответствие количества параметров. Если нет ошибки, то это баг, ошибка должна быть. когда вы вызываете super(), вы указываете на то, что сейчас нужно выполнить конструктор суперкласса. Из разных других соображений это нужно писать обязательно первой строчкой в конструкторе.
То, что вы описываете, не должно быть возможно даже в теории, т.как у класса может быть неограниченое количество наследников, и он никак не может знать о новых свойствах добавленых в наследниках, может знать только про свои или суперкласса.

markII 03.06.2010 13:06

Вложений: 1
Цитата:

Во втором случае trace(super(a)); не должно компилироваться, либо ошибка синтаксиса должна быть, либо несоответствие количества параметров. Если нет ошибки, то это баг
И как быть ?У меня никакой ошибки не выдает.Если это бак то как от него избавиться.(Я уже комп перегружал даже) все равно у меня не выдает ни одной ошибки
ЗЫ Вопрос!!!Как мне из класса MoveController прочитать метод и свойства класса RedBox.К примеру меременную с
вот исходники если нужно

markII 03.06.2010 14:16

Тогда подскажите мне можно ли сделать так.Мне надо чтобы у разных мувиков был один мувконтроллер.Т.е. создаются классы ,например, RedBox,GreenSphere,BlueRect.... и т.д.И они должны иметь одинаковый механизм управления MoveController(в примере я привел простейшее перетаскивание).Так вот, если я буду обращаться из класса MoveController к своим расширяющим классам RedBox,GreenSphere,BlueRect.... и т.д, то они все ведь разные и обратиться например так из класса MoveController к переменной RedBox.с я не могу т.к. таких классов много(при условии что с имеет тип static).Подскажите как правильно реализовать такую схему

Ramm 03.06.2010 15:01

М.б. в таком случае лучше использовать композицию, а не наследование?

markII 03.06.2010 15:17

Цитата:

М.б. в таком случае лучше использовать композицию, а не наследование?
а что это?

Добавлено через 20 минут
Вобщем, я понял.Из расширяемого класса нельзя считать метод или переменную,но можно в него передать заранее, на этапе инициализации конструктора.Если кому интересно что я собсна хотел получить вот код
Расширяющий класс
Код AS3:

package{
        import flash.display.*;
        import flash.geom.*;
        import flash.events.*;
 
        public class RedBox extends MoveController {
 
                public static var c:int = 276;
 
                private var bgColor:uint                      = 0xAE0D0D;
                private var borderColor:uint                  = 0x666666;
                private var borderSize:uint                  = 3;
                private var cornerWidth:uint                = 16;
                private var cornerHeight:uint                = 16;
 
                public function RedBox(x:Number,y:Number) {
                        var t = RedBox;
                        super(t);//этот метод передает этот класс в расширяемый класс MoveController.Можно передать статическую переменную с таким образом var t = RedBox.c;
                        var child:Shape = new Shape();
                        child.name = "RedBox"+x;
                        child.graphics.beginFill(bgColor);
                        child.graphics.lineStyle(borderSize, borderColor);
                        child.graphics.drawRect(x, y, cornerWidth,cornerHeight);
                        child.graphics.endFill();
                        addChild(child);
                        this.addEventListener(MouseEvent.MOUSE_DOWN,onMousedown);
                        this.addEventListener(MouseEvent.MOUSE_UP,onMouseup);
                }
        }
}

Расширяемый класс
Код AS3:

package{
        import flash.display.*;
        import flash.geom.*;
        import flash.events.*;
 
        public class MoveController extends Sprite {
 
                public var  a:Number = 6;
                private var al;
 
                public function MoveController(t) {
 
                        al = t//Здесь я принимаю значения от расширяющего класса.
                        trace("al= "+ al)                       
                }
                public function onMousedown(e:MouseEvent):void {
                        e.stopPropagation()
                        e.target.startDrag();
                }
                public function onMouseup(e:MouseEvent):void {
                        e.stopPropagation()
                        e.target.stopDrag();
                }
        }
}

Как оказалось все не так страшно(для меня).Коля Муков помог))


Часовой пояс GMT +4, время: 18:01.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.