Форум 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=203195)

Dip52 06.09.2013 03:12

А можно ли не перекрывать метод, а добавить в него ещё команды?
 
Здравствуйте.

Можно ли осуществить такую идею?

СлаваRa 06.09.2013 03:26

если вы про перегрузку методов, то в as3 ее нет.

Wolsh 06.09.2013 04:00

Код AS3:

override function method():void
{
        super.method();
        anotherCommand();
}


caseyryan 06.09.2013 08:16

Цитата:

А можно ли не перекрывать метод, а добавить в него ещё команды?
Это называется не команды, а параметры.
Нет, нельзя. Только как предложил Wolsh.

Fogflasher 06.09.2013 12:02

Цитата:

Сообщение от Wolsh (Сообщение 1145627)
Код AS3:

override function method():void
{
        super.method();
        anotherCommand();
}


Нельзя ли прокомментировать этот фрагмент для нубов? )

Я его пытаюсь понять так.
В подклассе создаем функцию с именем method(). Такая же функция есть и в суперклассе.
Вызываем функцию суперкласса командой super.method(); Это нам ничего не дает, просто тупо выполнилась функция суперкласса. Зачем, непонятно. Потом мы вызываем некий метод anotherCommand(), который, предположительно, есть в суперклассе. И... А почему бы его просто так не вызвать? Где подвох?

Мозайка не складывается.

Wolsh 06.09.2013 12:20

Вопрос был — как к уже описанному методу добавить еще каких-то действий.
super.method() выполняет код, который содержит этот "уже описанный метод", а anotherCommand это что угодно, что нужно "добавить", выполнить после.
И он не в суперклассе (было бы "super.anotherMethod()"). Он вообще не обязан быть где-то, это просто следующий, дополнительный, блок кода.

KumoKairo 06.09.2013 12:27

В данном случае это переопределение родительского метода method. Метода anotherCommand у родителя нет, поэтому логика выполнения следующая:
Допустим у нас есть класс Human, у которого есть метод eat(). С помощью этого метода человек ест еду. Но у нас есть уникальный человек Вася, который ест немного не так как все люди - он выпивает стакан водки после каждой трапезы.
В итоге получаем:
Код AS3:

public class Human
{
        public function Human()
        {
        }
 
        public function eat():void
        {
                trace("Омномном");
        }
}

И класс нашего товарища Васи:
Код AS3:

public class Vasya extends Human
{
        public function Vasya()
        {
        }
 
        override public function eat():void
        {
                super.eat();
                trace("Буль буль буль");
        }
}

Поэтому если мы вызовем метод eat() у объекта класса Vasya, в консоли получим
Цитата:

Омномном
Буль буль буль

Wolsh 06.09.2013 12:54

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

Fogflasher 06.09.2013 15:28

Wolsh, KumoKairo, понятно, прикольно.

Dip52 06.09.2013 15:44

Всем огромное спасибо.


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

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