Actionscript 3.0 -> Как переопределить защищенный метод из UIComponent

#apache-flex #actionscript-3 #actionscript #flash-builder

#apache-flex #actionscript-3 #actionscript #flash-builder

Вопрос:

Я хочу создать пользовательскую кнопку в ActionScript.

Это мой код:

 import flash.events.MouseEvent;

import mx.controls.Alert;

import spark.components.Button;

public class BookViewButton extends Button
{
    public function BookViewButton()
    {
        super();
    }
    override protected function mouseOver(event:MouseEvent,increase:int,newImageSource:String):void{
        Alert.show("mouseOver for new class works");
    }
}
  

Но Adobe Flash Builder выдает ошибку, переопределяющую строку метода.

Я попытался изменить сигнатуру нового метода, чтобы она точно соответствовала, вот так: (Я думал, ошибка может быть из-за того, что я добавлял дополнительные параметры в mouseOver функцию, поэтому Flex, возможно, не распознал ее как переопределяющую)

         override protected function mouseOver(event:MouseEvent):void{
        Alert.show("mouseOver for new class works");
    }
  

Но все равно это не работает. Появляется тот же маленький красный восклицательный знак, сигнализирующий об ошибке.

Я был бы очень признателен за любую помощь. Спасибо.

Ответ №1:

Какую версию SDK вы используете, если у вас есть mouseOver() метод в иерархии Spark Button ?

Кнопка Spark имеет mouseEventHandler() метод для переопределения:

 override protected function mouseEventHandler(event:Event):void
{
    super.mouseEventHandler(event);
    var mouseEvent:MouseEvent = event as MouseEvent;
    if (event.type == MouseEvent.ROLL_OVER)
    {
        // My roll over logic here
    }
}
  

И лучше опубликовать текст ошибки, который выдает вам IDE. Чтобы скопировать его, просто откройте Problems view во Flash Builder, найдите свое сообщение об ошибке и скопируйте его через контекстное меню.

Комментарии:

1. Но, пожалуйста, объясните мне, где вы нашли mouseOver() метод для переопределения?

2. На самом деле я нигде не нашел его, я думаю. Я вроде как догадался, что должен быть какой-то подобный метод. Или, возможно, я неправильно прочитал некоторую информацию. Я не знаю. Там, где я живу, сейчас 04:30 утра. Это должно частично объяснить это. =)

3. Хм .. Если я вас правильно понял, вы вызываете EventHandler суперкласса и затем добавляете к нему дополнительную логику?

4. Правильно. Мы не должны нарушать поведение по умолчанию.

5. Также, я думаю, важно сказать, что если вы просто хотите использовать наведение курсора мыши на событие, не расширяйте компонент, составьте его.

Ответ №2:

Вы не можете использовать override здесь, потому что у базового класса Button нет метода mouseOver для переопределения.

Если вы удалите ключевое слово override, оно должно работать нормально. Тем не менее, вам нужно будет фактически добавить прослушиватель для вашей функции, чтобы она вызывалась при наведении курсора мыши. Вот так:

 import flash.events.MouseEvent;
import mx.controls.Alert;
import spark.components.Button;

public class BookViewButton extends Button
{
    public function BookViewButton()
    {
        addEventListener(MouseEvent.MOUSE_OVER, _mouseOver);
    }

    private function _mouseOver(event:MouseEvent):void
    {
        Alert.show("mouseOver for new class works");
    }
}
  

Информация о super();

Нет необходимости вызывать super в конструкторе расширяемого класса, если только нет аргументов, которые вы хотите проанализировать. Пример.

 package
{
    public class A extends Object
    {
        public function A()
        {
            trace("A");
        }
    }
}
  

И расширяющий класс:

 package
{
    public class B extends A
    {
        public function B()
        {
            trace("B");
        }
    }
}
  

Если мы сделаем:

 var thing:B = new B();
  

На выходе вы получите:

 A
B
  

Однако, если вам нужны аргументы для вашего конструктора, вам нужно было бы проанализировать их до конструктора класса, который вы используете для расширения super() . Вот так:

 public class A extends Object
{
    public function A(arg:String)
    {
        trace(arg);
    }
}

public class B extends A
{
    public function B(arg:String)
    {
        super(arg);
    }
}
  

Теперь это выведет «asdf»:

 var thing:B = new B("asdf");
  

Комментарии:

1. Хммм, это имеет смысл. Но должен ли я действительно удалить вызов конструктора суперкласса ( super() ), как вы сделали в своем коде?

2. Спасибо, что взяли на себя труд написать все это. Мне просто интересно, потому что, поскольку я в основном расширяю базовый Button класс, я должен вызвать конструктор суперкласса и затем создать дополнительное поведение для моей пользовательской кнопки. Но, по-видимому, нет. Спасибо.

3. Нет, конструктор суперкласса будет вызван без необходимости super() 🙂