如何在一系列重载方法中强制使用对象类型输入值的invoke方法而不进行任何类型转换?

时间:2017-11-12 05:34:03

标签: oop overloading

例如,我有一个类有三个重载方法,如下所示:

class MyClass
{
    int sum(int i)
    {
       // Method implementation.
    }
    int sum(string x)
    {
       // Method implementation.
    }
    int sum(object o)
    {
       // Method implementation.
    }
}

我的问题是当我通过传递任何值(整数,字符串或对象)来调用MyClass的sum方法时,它应该仅调用第三种方法(使用对象类型输入参数)

class MainClass
{
    static void Main(string[] args)
    {
      MyClass obj = new MyClass();
      obj.sum(10);
      obj.sum("X")
    }
}

2 个答案:

答案 0 :(得分:0)

你说"没有类型铸造"但是你不能,因为你需要一些方法来向编译器指示要调用哪个版本,并且运行时使用它看到的类型来执行该操作。将int作为对象装箱意味着编译器将选择对象版本

sum(1);//call int version
sum((object)1); //call object version
sum((string)(object)"1"); //call string version
sum((object)(int)(object)1); //call object version

答案 1 :(得分:0)

首先,请允许我说,如果您在使用sum时有时想要调用int函数的一个版本,有时想要调用另一个版本,那么重载可能并非如此正确的工具。当您在概念上为多种不同类型实现相同的操作时,重载最有效,并且您希望编译器自动确定哪种函数是为每种类型调用的函数;如果你需要更多的手动控制调用哪个函数,你可能最好使用不同的名称。

也就是说,如果您确定这是您想要做的,您可以根据公共接口中的另一个函数实现对象的重载版本,如:

class MyClass
{
    int sum(int i)
    {
         // Method implementation.
    }
    int sum(string x)
    {
        // Method implementation.
    }
    int sum(object o)
    {
        sum_object(o);
    }
    int sum_object(object o)
    {
        // Method implementation for objects
    }
}

然后,当您要将对象版本应用于intstring个对象时,您只需直接调用sum_object