考虑一个示例:您必须编写一个程序来实现计算器的功能。计算器执行各种运算,例如数字的加、减及乘等。可以对任何类型的数据执行这些运算。这是否意味着您必须定义单独的函数名(如addInteger、addFloat和addDoublie)对每种此类数字执行加法运算?答案是不需要。您可以通过使用函数重载的概念来使用同一函数名对所有类型的数据执行加法运算。
函数重载是实现多态性的最常用方式。您可以通过在类中定义两个或更多同名函数来实现函数重载。但是,函数的每个定义必须在其函数签名中不同。以下代码显示了函数重载的用法:
using System;
namespace CalculateMax
{
class CalculateMax
{
public int Max(int number1, int number2)
{
if(number1 > number2)
{
return number1;
}
else
{
return number2;
}
}
public float Max(float number1,float number2)
{
if( number1 > number2 )
{
return number1;
}
else
{
return number2;
}
}
}
class MaxCalc
{
static int Main(string[] args)
{
CalculateMax calc = new CalculateMax();
Console.WriteLine("{0}",calc.Max(5.4F,8.6F));
//Both function calls differ
Console.WriteLine("{0}",calc.Max(19,12));
//only in their parameters
Console.ReadLine();
return 0;
}
}
}
在上述代码中,Max()方法啊显示了两个数number1和number2中最大的一个数字。Max()方法通过传递整数和浮点值给它来重载。
下图显示了上述代码的输出。
除了函数重载,您也可以重载构造函数。
小问题:
以下哪个选项表示函数重载?(选择所有使用的项)
a.void Dispaly(int x, int y, float z){ }
void Display( int x, int y){ }
b.int Display ( int x ){ }
void Display( int x ){ }
c.float Display( float x, int y){ }
float Display( int x,float y){ }
d.void display( float x, int y){ }
void Display( int x, float y){ }
答案:
a.void Dispaly(int x, int y, float z){ }
void Display( int x, int y){ }
c.float Display( float x, int y){ }
float Display( int x,float y){ }
构造函数是特殊类型的方法,因此也可被重载。重载构造函数在C#中常用于在创建对象时提供灵活性。
以下代码显示重构函数的用法:
using System;
class CalculateNumber
{
private int number1, number2, total;
//Default constructor
public CalculateNumber()
{
number1 = number2 = total = 0;
}
public CalculateNumber(int num1,int num2) /*Two-argument constructor */
{
number1 = num1;
number2 = num2;
total = 0;
}
public void AddNumber()
{
total = number1 + number2;
}
public void DisplayNumber()
{
Console.WriteLine("The sum of two numbers is {0}",total);
}
}
class CalNum
{
static int Main(String[] args)
{
//Default constructor invoked
CalculateNumber cal1 = new CalculateNumber();
//Parametric constructor
CalculateNumber cal2 = new CalculateNumber(4,3);
cal1.AddNumber(); //add() invoked to calculate sum of members
cal1.DisplayNumber();
cal2.AddNumber(); //add() invoked to calculate sun of members
cal2.DisplayNumber();
return 0;
}
}
在上面的代码中,为对象call调用默认构造函数,因为它未使用任何参数创建。为cal2对象调用带参数化构造函数,因为它使用参数创建。
下图显示了上述代码的输出。
小问题:
以下哪个关于构造函数的语句时正确的?(选择所有使用的项)
a.构造函数不能被重载
b.如果没有为类提供构造函数,则编译器创建和执行默认构造函数。
c.不能显示调用构造函数
d.构造函数不能返回值
答案:
b.如果没有为类提供构造函数,则编译器创建和执行默认构造函数。
c.不能显示调用构造函数
d.构造函数不能返回值