Различное поведение функции при различных типах аргумента

Предположим нам необходимо различное поведение функции в зависимости от типа получаемого аргумента. Реализуется несколькими способоми. 1ый кажется самый простой для восприятия, а возможно и самый быстрый.

package ;

import flash.display.Shape;

import Type;

class Main
{
        static public function main()
        {
                f(true);
                f(12345);
                f(1.2345);
                f("abcdef");
                f(new Shape());
                f(f);
                f({name: "abcdef" } );
                f(null);
        }
       
        static public function f(value:Dynamic)
        {
                //1) Рабочий вариант на switch
                switch(Std.string(Type.typeof(value)))
                {
                        case "TBool":                           trace("I am Bool");
                        case "TInt":                            trace("I am Int");
                        case "TFloat":                          trace("I am Float");
                        case "TClass([class String])":          trace("I am String");
                        case "TClass([class Shape])":           trace("I am Shape");
                        case "TFunction":                       trace("I am Function");
                        case "TObject":                         trace("I am Object");
                        case "TNull":                           trace("I am Null");
                }
               
                //2) Рабочий вариант на if
                if (Std.is(value, Bool))                trace("I am Bool");
                else if (Std.is(value, Int))            trace("I am Int");
                else if (Std.is(value, Float))          trace("I am Float");
                else if (Std.is(value, String))         trace("I am String");
                else if (Std.is(value, Shape))          trace("I am Shape");
                else if (Reflect.isFunction(value))     trace("I am Function");
                else if (Reflect.isObject(value))       trace("I am Object");
                else if (value == null)                 trace("I am Null");

                //3) Рабочий вариант на if
                if (Type.enumEq(Type.typeof(value), ValueType.TBool))                           trace("I am Bool");
                else if (Type.enumEq(Type.typeof(value), ValueType.TInt))                       trace("I am Int");
                else if (Type.enumEq(Type.typeof(value), ValueType.TFloat))                     trace("I am Float");
                else if (Type.enumEq(Type.typeof(value), ValueType.TClass(String)))             trace("I am String");
                else if (Type.enumEq(Type.typeof(value), ValueType.TClass(Shape)))              trace("I am Shape");
                else if (Type.enmEq(Type.typeof(value), ValueType.TFunction))                   trace("I am Function");
                else if (Type.enumEq(Type.typeof(value), ValueType.TObject))                    trace("I am Object");
                else if (Type.enumEq(Type.typeof(value), ValueType.TNull))                      trace("I am Null");
        }
}

Комментарии

Какой

Какой ужас...Почему нельзя как в Си?

Хотя бы

Хотя бы работает )

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <blockcode> <dd>
  • Строки и параграфы переносятся автоматически.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>. The supported tag styles are: <foo>, [foo].
  • Use [gist:####] where #### is your gist number to embed the gist.

Подробнее о форматировании

CAPTCHA
Для отсева спамеров)
6
W
t
8
d
H
Enter the code without spaces and pay attention to upper/lower case.