C# 8.0本质论
上QQ阅读APP看书,第一时间看更新

5.7 方法重载

代码清单5.18调用DirectoryCountLines()方法来统计*.cs文件中的源代码行数。但要统计*.h/*.cpp文件或*.vb文件的代码行数,DirectoryCountLines()就无能为力了。我们希望有这样一个方法,它能获取文件扩展名作为参数,同时保留现有方法定义,以便默认处理*.cs文件。

一个类中的所有方法都必须有唯一签名,C#依据方法名、参数数据类型或参数数量的差异来定义唯一性。注意方法返回类型不计入签名。两个方法只是返回类型不同会造成编译错误(即使返回的是两个不同的元组)。如一个类包含两个或多个同名方法,就会发生方法重载。对于重载的方法,参数数量或数据类型肯定不同。

注意 方法的唯一性取决于方法名、参数数据类型或参数数量的差异。

方法重载是一种操作性多态(operational polymorphism)。如由于数据变化造成同一个逻辑操作具有许多(“多”)形式(“态”),就会发生“多态”。以WriteLine()方法为例,可向它传递一个格式字符串和其他一些参数,也可只传递一个整数。两者的实现肯定不同。但在逻辑上,对于调用者该方法就是负责输出数据。至于方法内部如何实现,调用者并不关心。代码清单5.19是一个例子,输出5.10展示了结果。

代码清单5.19 使用重载统计*.cs文件的行数

注①:该代码可用using语句改进,但因为我们还没有讲到,所以暂时不使用。

输出5.10

方法重载的作用是提供调用方法的多种方式。如本例所示,在Main()中调用Directory-CountLines()方法时,可选择是否传递要搜索的目录和文件扩展名。

本例修改DirectoryCountLines()的无参版本,让它调用单一参数的int Directory-CountLines(string directory)。这是实现重载方法的常见模式,基本思路是:开发者只需在一个方法中实现核心逻辑,其他所有重载版本都调用那个方法。如核心实现需要修改,在一个位置修改就可以了,不必兴师动众修改每一个实现。通过方法重载来支持可选参数时该模式尤其有用。注意这些参数的值在编译时不能确定,不适合使用C# 4.0新增的“可选参数”功能。

注意 将核心功能放到单一方法中供其他重载方法调用,以后就只需在核心方法中修改,其他方法将自动受益。