Перегрузка функции по типу возврата? - PullRequest
243 голосов
/ 14 января 2009

Почему более распространенные статически типизированные языки не поддерживают перегрузку функций / методов по типу возвращаемого значения? Я не могу думать ни о чем, что делает. Это кажется не менее полезным или разумным, чем поддержка перегрузки по типу параметра. Почему это так менее популярно?

Ответы [ 14 ]

0 голосов
/ 10 мая 2015

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

C #

public enum FooReturnType{
        IntType,
        StringType,
        WeaType
    }

    class Wea { 
        public override string ToString()
        {
            return "Wea class";
        }
    }

    public static object Foo(FooReturnType type){
        object result = null;
        if (type == FooReturnType.IntType) 
        {
            /*Int related actions*/
            result = 1;
        }
        else if (type == FooReturnType.StringType)
        {
            /*String related actions*/
            result = "Some important text";
        }
        else if (type == FooReturnType.WeaType)
        {
            /*Wea related actions*/
            result = new Wea();
        }
        return result;
    }

    static void Main(string[] args)
    {
        Console.WriteLine("Expecting Int from Foo: " + Foo(FooReturnType.IntType));
        Console.WriteLine("Expecting String from Foo: " + Foo(FooReturnType.StringType));
        Console.WriteLine("Expecting Wea from Foo: " + Foo(FooReturnType.WeaType));
        Console.Read();
    }

Может быть, этот пример тоже может помочь:

C ++

    #include <iostream>

enum class FooReturnType{ //Only C++11
    IntType,
    StringType,
    WeaType
}_FooReturnType;

class Wea{
public:
    const char* ToString(){
        return "Wea class";
    }
};

void* Foo(FooReturnType type){
    void* result = 0;
    if (type == FooReturnType::IntType) //Only C++11
    {
        /*Int related actions*/
        result = (void*)1;
    }
    else if (type == FooReturnType::StringType) //Only C++11
    {
        /*String related actions*/
        result = (void*)"Some important text";
    }
    else if (type == FooReturnType::WeaType) //Only C++11
    {
        /*Wea related actions*/
        result = (void*)new Wea();
    }
    return result;
}

int main(int argc, char* argv[])
{
    int intReturn = (int)Foo(FooReturnType::IntType);
    const char* stringReturn = (const char*)Foo(FooReturnType::StringType);
    Wea *someWea = static_cast<Wea*>(Foo(FooReturnType::WeaType));
    std::cout << "Expecting Int from Foo: " << intReturn << std::endl;
    std::cout << "Expecting String from Foo: " << stringReturn << std::endl;
    std::cout << "Expecting Wea from Foo: " << someWea->ToString() << std::endl;
    delete someWea; // Don't leak oil!
    return 0;
}
0 голосов
/ 16 декабря 2012

Эта функция перегрузки не сложна в управлении, если вы посмотрите на нее немного по-другому. рассмотрим следующее

public Integer | String f(int choice){
if(choice==1){
return new string();
}else{
return new Integer();
}}

если бы язык возвращал перегрузку, это допустило бы перегрузку параметров, но не дублирование. это решило бы проблему:

main (){
f(x)
}

потому что есть только один f (выбор по умолчанию) на выбор.

0 голосов
/ 04 августа 2012

Как уже было показано - неоднозначные вызовы функции, которая отличается только типом возвращаемого значения, вводят неоднозначность. Неоднозначность вызывает дефектный код. Неисправный код следует избегать.

Сложность, вызванная попыткой двусмысленности, показывает, что это не хороший взлом. Помимо интеллектуальных упражнений - почему бы не использовать процедуры с эталонными параметрами.

procedure(reference string){};
procedure(reference int){};
string blah;
procedure(blah)
0 голосов
/ 14 января 2009

Большинство статических языков также теперь поддерживают дженерики, которые решат вашу проблему. Как указывалось ранее, без параметров diff нет способа узнать, какой из них вызывать. Поэтому, если вы хотите сделать это, просто используйте дженерики и называйте это днем.

...