Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 如何使用对象类型输入值强制调用方法,而无需在一系列重载方法中进行任何类型转换?_Oop_Overloading - Fatal编程技术网

Oop 如何使用对象类型输入值强制调用方法,而无需在一系列重载方法中进行任何类型转换?

Oop 如何使用对象类型输入值强制调用方法,而无需在一系列重载方法中进行任何类型转换?,oop,overloading,Oop,Overloading,例如,我有一个包含三个重载方法的类,如下所示: class MyClass { int sum(int i) { // Method implementation. } int sum(string x) { // Method implementation. } int sum(object o) { // Method implementation. } } 我的问题是,当我通

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

class MyClass
{
    int sum(int i)
    {
       // Method implementation.
    }
    int sum(string x)
    {
       // Method implementation.
    }
    int sum(object o)
    {
       // Method implementation.
    }
}
我的问题是,当我通过传递任何值(整数、字符串或对象)调用MyClass的sum方法时,它应该只调用第三个方法(使用对象类型输入参数)

您说过“不使用类型转换”,但您不能,因为您需要某种方式向编译器指示要调用哪个版本,并且运行时使用它看到的类型来执行该操作。将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

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

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

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
    }
}

然后,当您要将对象版本应用于
int
string
对象时,您只需直接调用
sum\u object

如果您总是想调用接受对象的版本,为什么其他类型会有特定的重载?我相信是编译器而不是运行时做出了这个决定。@Caius Jard。。我完全同意你的看法。事实上,在一次面试中,我被问到了同样的问题,我也向面试官解释了同样的事情。。。但他说有办法做到这一点。。当我请他解释的时候。。他回复说把它发到网上。。你会得到多个答案。。。也许他是个非凡的天才。。。但是我找不到更好的答案了。我把它贴在这里了。。希望有人能得到面试官想要的答案:也许你可以用一个用新关键字声明的对象版本对它进行子类化,这将替换所有的父定义-不确定从未做过/不明白为什么你需要/不能测试,因为我是从一个没有过载的iPhone发布的。。您正在创建一个完全不同的方法。对于对象,仍然有一个重载版本的
sum
——我只是提供了另一种调用函数的方法,当重载解析会出于您的目的选择“错误”版本的
sum
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
    }
}