为什么在OOPS中定义重载方法?

时间:2017-11-15 09:37:16

标签: java c++ oop

访谈者问我方法重载是什么,我给出了答案说,方法重载在同一个类中,其中两个或多个方法具有相同的名称但签名不同,以下示例 -

//method with two parameters
public int add(int a, int b){
  return a + b;
}

//method with three parameters    
public int add(int a, int b, int c){
  return a + b + c;
}

在这个例子中,他说为什么我们需要两个同名的方法,即add。相反,我们可以有两个不同名称的方法,即addTwoNumbersaddThreeNumbers,表示方法名称更详细,如果我们遵循这种方法,我们不需要方法重载。 (对于使用方法重载的其他Java apis也是如此。)

考虑到他的上述想法,他问为什么OOPS原则仍然存在方法重载以及为什么如此密集地使用?发明者有什么意图引入方法重载的概念?

4 个答案:

答案 0 :(得分:0)

在我看来,它是为了避免任何混淆而引入的。由于这两种方法都执行相同的操作,因此程序员可能很容易搜索执行相同功能的相同方法名称,而不是查找具有不同名称执行相同功能的方法。

答案 1 :(得分:0)

这背后的主要原因是代码的清洁度。 例如,让我们在java中使用 print 方法。它是一个重载函数,因为它可以有不同的争论但具有相同的名称。

System.out.print(Boolean b),System.out.print(Integer b),System.out.print(String b),System.out.print(Float b) 

等等。但我们所知道的是有一种印刷方法,我们必须通过我们需要打印的任何东西。如果没有重载,那么函数的名称将看起来像

 System.out.printBoolean(Boolean b),System.out.printInteger(Integer b),System.out.printString(String b),System.out.printFloat(Float b) 

这不仅使代码复杂,而且难以记住何时调用哪个函数。当最终目标相同但使用的路径或对象可能不同时,使用重载。在这种情况下,我们的最终目标是打印它是整数还是字符串等。

答案 2 :(得分:0)

  

考虑到他的上述想法,他问为什么OOPS原则仍然存在方法重载以及为什么如此密集地使用?发明者有什么意图引入方法重载的概念?

首先,重载与OOP无关。来自Programming -- Principles and Practice Using C++的Bjarne Stroustrup:

  

继承,运行时多态和封装的使用是面向对象编程的最常见定义。

请注意,重载不是OOP的关键原则之一。

现在,如果我们来过载,那么支持它的逻辑就是使代码可读(虽然它可以被认为是基于意见的)。例如,C具有以下功能:

int abs(int j);
long int labs(long int j);
double fabs(double x);
float fabsf(float x);

但是C ++重载了abs版本的不同类型(C ++仍然支持C函数以实现向后兼容)。如果编译器本身可以区分具有相同名称但不同类型的函数(即重载函数),则不是为不同类型的相同功能发明新名称,而是更容易且更易读。这也称为静态多态,如@Basilevs指出的评论。

我们可以从他的书The Design and Evolution of C++中得到C ++创建者Bjarne Stroustrup的意图。据他说,有几个人希望操作员超载,但他最初不愿意:

  1. 很难实施。
  2. 很难教导,也难以准确定义。
  3. 使用运算符重载的代码被认为效率低下。
  4. 它被认为使代码难以理解。
  5. 然而,如果这些问题可以解决,那么它可以解决一些真正的问题,很多人都希望得到这种支持。他最终克服了这些问题,并且重载成为了C ++的一部分。从书中可以看出:

      

    但是,如果所有这些猜想都是错误的,那么重载将解决C ++用户的一些实际问题。有些人希望在C ++中拥有复杂的数字,矩阵和类似APL的向量。有些人想要范围检查数组,多维数组和字符串。至少有两个单独的应用程序,人们想要重载逻辑运算符,如I(或),& (和)和A(独家或)。我看到它的方式,列表很长,并且随着c ++用户群的大小和多样性而增长。我对[4],#34;重载的回答使代码模糊不清,"是我的几个朋友,我认为他们的价值观和数十年来的经验,他们声称,如果他们的代码超载,他们的代码就会变得更加清晰。那么如果可以用重载编写模糊的代码呢?可以用任何语言编写模糊的代码。重要的是如何更好地使用某个功能,而不是如何滥用它。

    相关部分(第78页)在Google Books中可用于免费预览。请仔细阅读以获得更详细的讨论。

    虽然这是C ++发明者做出的设计决定,但我认为类似的理性也适用于其他语言。

答案 3 :(得分:0)

为什么功能超载呢? 当行动几乎相同时,只是输入的集合是不同的。

在Java中,使用函数重载,我们可以支持可选参数的概念(因为在Java中没有直接支持它)

String formatStr(String str){   //if you don't care about having a different choice than default
   String defaultPrefix = "__"; 
   return formatStr(str, defaultPrefix); 
}  

String formatStr(String str, String prefix){  //You are free to choose whatever prefix you want.
    return prefix + str; 
}