重载是 OOP 编译时的多态性。但是,VFP 虽然号称是面向对象的编程语言,却缺乏这一特性。VFP 的 OOP 仅仅实现了封装和继承。
举例来说,当你在 VFP 中创建一个自定义类时,类方法是不能重名的。也就是说,如果你在自定义类 AB 中有一个方法名是 test,它接收一个参数 a,那么,你就不能在 AB 中增加另一个方法名是 test,接收两个参数 a 和 b 的方法。然后,你看到的就是 test、test1、test2......这样的自定义方法。
然后,在“不耽误挣钱”的商业思维基础之上,当你隔了N天/月/年后,需要再次调用它时,你不得不再次查询源码来搞清楚 test/test1/test2...之间的区别。
有人会说,自定义方法也可以有方法描述来明确它们之间的区别啊。是的,这是一个方法。但是,既然具有了“不耽误挣钱”的思维模式,那么,很大程度上,是不知道该如何在 VFP IDE 中实现的......况且,VFP IDE 中的属性窗口中的“说明”部分,可能被无意关闭或者空间不足以完整呈现方法说明.....那是因为你的方法说明的字符长度超出了它的“范围”。
X#终结了这一切。
首先,X#是一门 .NET 语言(强类型);其次,它兼容 VFP 语法。
但是,在 X# 中使用重载,对于大多数 foxer 来说,还是有一点点障碍的。
在 VFP 中,方法定义的语法有两种。
第一种:
PROCEDURE ProcedureName
[ LPARAMETERS parameter1 [ ,parameter2 ] ,... ]
Commands
[ RETURN [ eExpression ] ]
[ENDPROC]
第二种:
PROCEDURE ProcedureName( [ parameter1 [ AS para1type ][ ,parameter2
[AS para2type ] ] ,...] ) [ AS returntype ]
Commands
[ RETURN [ eExpression ] ]
[ENDPROC]
第一种是绝大多数 foxer 所熟知的,尽管你可能看不明白这个语法定义。但是,我从此刻起,建议 foxer 在使用时,尽可能的使用第二种语法定义。
你注意到两种语法定义的区别了吗?
在 VFP9 的帮助文件中,有这样一节:在 WITH ... ENDWITH 命令和 FOR EACH ... ENDFOR 命令中支持智能感应。
其中,有这样一句描述:当用户输入 AS 关键字时,智能感应会显示登记在 FoxCode.dbf 数据表的 Type 字段值为 "T" 之类型清单。如果指定的是一个合法的类型,则在一个 WITH ... ENDWITH 命令或 FOR EACH ... ENDFOR 命令内输入一个句点时会显示对象参考的智能感应。
好吧。在我有限的 VFP 认知中,我只能认为 AS 关键字是为了让 VFP 的代码更像强类型语言,例如 C#,的语法,其在 VFP 中实际存在的意义仅仅是为了更好的使用智能感应(实际上,可能有很多使用所谓汉化版VFP的,根本不知道“智能感应”是啥)。但是,从此刻起,请使用第二种语法。
当你习惯了第二种语法时,在使用 X# 时,才能一帆风顺的在其中实现“重载”。这并不是说,你在 VFP 中习惯第一种语法就不能在 X# 中实现重载,而是说,你会“自然而然”的认为,X# 对 VFP 的兼容度确实不错。
这其实在于 X# 中一个特定的概念:调用约定
简单的说,VFP中使用的是 CLIPPER 调用约定;而 X# 实现重载时使用的是 STRICT 约定。如果你不打算去查阅 X# 帮助来了解二者的差异,那么,就记住:在定义变量/函数返回值时使用 AS 关键字,实质就是使用了 STRICT 约定。无论你使用的是 VFP 还是 X#。
follow me,延续自己的技术生命!