您所在的位置: 首页>>读书频道>>设计开发>>.Net系列>>

4.7 方法重载

http://book.51cto.com  2008-07-19 13:27  (美)米凯利斯(Michaelis, M.)著/周靖译  人民邮电出版社  我要评论(0)
  • 摘要:《C#本质论》第4章方法和参数,这一章讨论了如何将语句组合成一个方法,除此之外,还讨论了如何调用一个方法,其中包括如何将数据传给方法以及从方法中接收数据,本小节为大家介绍方法重载。
  • 标签:C#  本质论  参数  C#本质论

4.7 方法重载

代码清单4-15调用了DirectoryCountLines()方法,该方法用于统计*.cs文件包含的源代码行数。然而,如果要统计*.h/*.cpp文件或*.vb文件的代码行数,DirectoryCountLines()就不起作用了。因此,我们希望有这样一个方法,它能获取文件扩展名作为参数,同时保留现有的方法定义,以便在默认情况下处理*.cs文件。

一个类中的所有方法都必须有一个唯一的签名,C#依据方法名、参数数据类型或者参数数量的不同来定义唯一性。但是,在所有这些依据中,并不包括方法的返回类型;假如两个方法只是返回数据类型不同,那么会造成一个编译错误。假如一个类包含两个或者更多同名的方法,就会发生方法重载(method overloading)。对于重载的方法来说,参数的数量和/或类型肯定是不同的。

方法重载是一种操作性多态(operational polymorphism)。有的时候,我们可能需要在多个不同的实现中,对不同的数据执行相同的逻辑操作。以WriteLine()方法为例,我们可能向它传递一个格式字符串和其他一些参数,也可能只向它传递一个整数。两者的具体实现肯定是不同的,但在逻辑上,对于调用者来说,这个方法负责的是输出数据。至于方法内部具体是如何实现的,调用者并不关心。代码清单4-16展示了一个例子,输出4-10展示了结果。

代码清单4-16 返回一个目录下的所有文件的总行数

public static class LineCounter
{
public static void Main(string[] args)
{
int totalLineCount;
      if (args.Length > 1)
{
totalLineCount =
DirectoryCountLines(args[0], args[1]);
}
if (args.Length > 0)
{
totalLineCount = DirectoryCountLines(args[0]);
}
else
{
totalLineCount = DirectoryCountLines();
}
      System.Console.WriteLine(totalLineCount);
}
  static int DirectoryCountLines()
{
return DirectoryCountLines(
Directory.GetCurrentDirectory());
}
  static int DirectoryCountLines(string directory) 
{
return DirectoryCountLines(directory, "*.cs");
}
  static  int DirectoryCountLines(
string directory, string extension)
{
int lineCount = 0;
foreach (string file in
Directory.GetFiles(directory, extension))
{
lineCount += CountLines(file);
}
      foreach (string subdirectory in
Directory.GetDirectories(directory))
{
lineCount += DirectoryCountLines(subdirectory);
}
      return lineCount;
}
  private static int CountLines(string file)
{
int lineCount = 0;
string line;
FileStream stream =
new FileStream(file, FileMode.Open);
StreamReader reader = new StreamReader(stream);
line = reader.ReadLine();
while(line != null)
{
if (line.Trim() == "")
{
lineCount++;
}
line = reader.ReadLine();
}
      reader.Close();
stream.Close();
return lineCount;
}
}
输出4-10
>LineCounter.exe .\ *.cs
28

方法重载的作用是提供调用方法的多种方式。如上例所示,在调用DirectoryCountLines()方法的时候,你可以选择是否传递要搜索的目录以及文件扩展名。

注意,我们更改了DirectoryCountLines()的无参数版本,让它调用单参数版本intDirectory- CountLines(string directory)。这是实现重载方法时经常采用的一种模式。它的基本思路是:开发者只需在一个方法中实现核心逻辑,其他所有重载版本都调用那个方法。如果核心实现发生了改变,那么只需要在一个位置修改,而不必在每个实现中都进行修改。利用方法重载技术来支持可选参数的时候,这种模式非常有用。

【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节
C#实用基础教程
C#技术开发指南
深入Vista应用程序开发
Ruby on Rails 社区网站开发
ASP.NET从入门到精通
 
 验证码: (点击刷新验证码)   匿名发表
  • Visual C++ 完全自学宝典

  • 作者:强锋科技,朱洪波
  • Visual C++ 6.0是微软公司为程序人员提供的Visual Studio 6.0工具套件中的重要组成部分。本书由浅入深地介绍使用Visual C++ 6.0..
Copyright©2005-2008 51CTO.COM 版权所有