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 if (args.Length > 1) System.Console.WriteLine(totalLineCount); static int DirectoryCountLines() static int DirectoryCountLines(string directory) static int DirectoryCountLines( foreach (string subdirectory in return lineCount; private static int CountLines(string file) reader.Close(); |
>LineCounter.exe .\ *.cs |
方法重载的作用是提供调用方法的多种方式。如上例所示,在调用DirectoryCountLines()方法的时候,你可以选择是否传递要搜索的目录以及文件扩展名。
注意,我们更改了DirectoryCountLines()的无参数版本,让它调用单参数版本intDirectory- CountLines(string directory)。这是实现重载方法时经常采用的一种模式。它的基本思路是:开发者只需在一个方法中实现核心逻辑,其他所有重载版本都调用那个方法。如果核心实现发生了改变,那么只需要在一个位置修改,而不必在每个实现中都进行修改。利用方法重载技术来支持可选参数的时候,这种模式非常有用。
| 回书目 上一节 下一节 |