Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Interface для... Function (http://www.flasher.ru/forum/showthread.php?t=131484)

Котяра 21.10.2009 09:02

Interface для... Function
 
(касается как as2, так и as3)
Каким образом задать тип ф-ции, являющейся аргументом ф-ции? Т.е. необходимо задать строгую типизации параметров. Нужно что-то вроде интерфейса для классов
пример:
Код AS3:

public function doFunction (f:Function, a:int,b:int):String
{
      return f(a,b);
    // как задать, что f - ф-ция,
    //принимающая 2 параметра (a:int,b:int), и возвращающая String?
}


Wolsh 21.10.2009 10:42

Есть правило - "один вопрос - одна тема".
Так что плодите.
Непонятен сам вопрос "задать тип функции". Это тип возвращаемого ей значения - как вообще его можно задать извне? Он зависит от того, что ф-ия возвращает оператором return, а не ф-ия возвращает то, что написано после двоеточия))))

Добавлено через 9 минут
Код AS1/AS2:

public function doFunction (f:Function, a:int,b:int):String
{
          var c:String = f(a,b).toString();
          return c;
}


alexcon314 21.10.2009 11:06

Нужно что-то типа typedef. В ас такого нема. А сам тип Function вообще ни о чем не говорит.

Котяра 21.10.2009 16:08

Цитата:

Сообщение от Wolsh (Сообщение 859370)
Непонятен сам вопрос "задать тип функции". Это тип возвращаемого ей значения - как вообще его можно задать извне? Он зависит от того, что ф-ия возвращает оператором return, а не ф-ия возвращает то, что написано после двоеточия))))

Добавлено через 9 минут
Код AS1/AS2:

public function doFunction (f:Function, a:int,b:int):String
{
          var c:String = f(a,b).toString();
          return c;
}


"задать тип ф-ции" имелось ввиду задать некий интерфейс ф-ции, т.е. что в качестве параметра f ожидается ф-ция вида function f(a:int,b:int):String и никакая другая.
т.е. ф-ция f - должна реализовывать некий интерфейс.
тогда использование может выглядеть где-то так:
Код AS3:

public function doFunction (f:IFunction, a:int,b:int):String
{
          var c:String = f(a,b).toString();
          return c;
}

В чистом виде такого в АS нет, может как-то извернуться можно?

SamFR 22.10.2009 01:50

В AS, в т.ч. AS3, такого сделать не получится. Можно, конечно, как-нибудь извратиться, но это не будет ни красиво, ни быстро.

А чем, кроме проверки на этапе компиляции, не устраивает вариант, предложенный Wolsh?

wvxvw 22.10.2009 02:35

Проголосуй!
http://bugs.adobe.com/jira/browse/ASC-3853
:)

Да, что я делаю, если ну оооочень надо, а производительность не важна:
Код AS3:

public class FunctionInterface extends AbstractDelegate {
public function FunctionInterface(method:Function, param1:Type1, param2:Type2 ... paramN:TypeN)
{
super(method);
....
}
public override function call():* // увы...
{
return super._metod(param1, param2, ... paramN);
}

Цитата:

Сообщение от SamFR (Сообщение 859693)
В AS, в т.ч. AS3, такого сделать не получится. Можно, конечно, как-нибудь извратиться, но это не будет ни красиво, ни быстро.

А чем, кроме проверки на этапе компиляции, не устраивает вариант, предложенный Wolsh?

Что интересно, вполне может быть, что в AS2 как раз получится :) Лень пробовать, но, сколько мне память не изменяет, в AS2 можно было наследоваться от всех классов, Function в том числе :)

BlooDHounD 22.10.2009 03:18

то что Вы тут обсуждаете называет сигнатура. это там в каких-то зачатках есть в ES, но в AS ни в каких нету ( увы. тоже очень хочется.

AL.exe 22.10.2009 11:37

А как насчет такого изврата:

Код AS3:

public function doFunction (f:Function, a:int,b:int):String
{
 
    var q:Funtion = function(a:int, b:int):String
    {
        return f(a,b)
    }
 
    return q(a,b)
 
}

А, прочитал все дальше первого поста и понял, что это не то, что нужно :) Но можно там вставить try catch и кидать ValueError при несоответствии типов аргументов или возвращаемого значения.

DarkLight 22.10.2009 14:22

Если такая штука нужна только в некоторых компонентах приложения, их можна на haXe вообще написать, т к там это есть.
Я пишу для себя комментарии просто в коде, чтобы все это было под рукой, плюс упоминаю в asDoc комментариях.
Код AS3:

function a(b:Function/*int,int->void*/){...}


Wolsh 24.10.2009 02:20

Вобщем, я вижу только одно решение - создавать классы для каждой функции.
Класс Func1, класс Func2, класс Func3...
Все эти классы поддерживают интерфейс IFunc, который предписывает им иметь метод func(a:int, b:int):String
И тогда -
Код AS1/AS2:

public function doFunction (f:IFunc, a:int,b:int):String 
{
    return f.func(a, b)
}



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

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