VBA 类模块系列之二——什么是类

我记得小时候包饺子,包得不好看,但是有一个包饺子的工具,塑料的,展开就是一个圆型,中间凹下去,边缘有很多褶子, … 继续阅读“VBA 类模块系列之二——什么是类”

我记得小时候包饺子,包得不好看,但是有一个包饺子的工具,塑料的,展开就是一个圆型,中间凹下去,边缘有很多褶子,把饺子皮放在上面,中间放坨肉馅,然后把这个工具折叠起来,用力一压,一个漂亮的饺子就包好了。用这个工具包出来的饺子,漂亮极了,大小一样,每个褶子也都一样。

这跟编程有一毛钱关系吗?呃,有的,这个工具就是,用这个工具包出来的饺子就是这个类的对象,或者称之为类的实例

在Access VBA开发中,你其实一直在使用类。比如你新创建了一个窗体,从窗体设计功能区控件组中拖了一个文本框控件到这个窗体上,你就是创建了这个文本框类的一个实例,然后你调整了一下这个文本框的大小和位置,实际上你是在调整这个文本框实例对象的 Left,  Top, Width, Height 属性。当你的程序发布以后,用户在这个文本框上输入一些信息,就会触发这个文本框实例对象的 Change 事件,如果你为这个事件写了代码,那这个代码就会响应这个事件,自动执行。如果这个文本框绑定到了某个数据源,在一个多用户的环境中,你想知道这个数据源最新的数据,你会调用这个文本框的Reqeury方法。你创建的这个窗体,其实也是一个类,当你加载这个窗体的时候,实际上你是在实例化这个窗体类。

用面向对象编程(OOP)的术语,为基于它创建的所有对象定义了属性(Properties)方法(methods)事件(Events)。这些属性,方法和事件构成了这个类的接口(Interface)

我是苹果的粉丝,不过还没达到脑残的级别:) 买过3部苹果手机:iPhone1,iPhone5,iPhone7。iPhone1的数据线接口30pin,非常宽,还区分正反面,晚上要充电的话,50%的几率要插2次,第一次插不进去,就知道插反了。等到iPhone5出来的时候,数据线换成了Lighting接口,方便多了,不区分正反,随便插。以前买的iPhone1的数据线就不能用到iPhone5上了。iPhone7与iPhone5的数据线相同,以前多买的几根iPhone5数据线还能继续用。据说苹果以后打算使用Type-C接口,与其他手机厂商保持一致。这个手机数据线接口变来变去对消费者不是一件好事。我一般都是家里,办公室,车上各一根,接口变一次,我就得多花钱买2根。家里其他人如果不是用的苹果,这数据线还无法共用。

类的接口其实与手机数据线的接口有很多相通的地方。一旦你设计好了某个类的接口,不要去变他。为什么不能变呢?要多花钱买2根?开玩笑😝,这可不是多花钱的事。一个设计好了的类,肯定是要投入使用的,在你的项目的某个地方,肯定会用到这个类,写了一些代码,实例化这个类,然后修改了这个类对象的属性,调用了这个类对象的方法,可能还写了一些响应这个类对象的事件代码。好了,你通过这个类完成了这个项目的一些功能。不久以后,你越看这个类越不顺眼,水平提高了嘛,你把这个类的属性,方法,事件全部删掉了,重新设计出一个你更加满意的类。当你洋洋得意的完工后,编译了一下你的项目,“咚”!编辑器跳出提示:编译错误,方法和数据成员未找到。傻眼了吧?

问题出在哪里?原来你修改了这个类以后,凡是项目使用这个类的地方的代码没有同步修改过来!你于是要将所有使用这个类的地方的代码全部修改一遍。这就好比iPhone5的数据线接口换成Lighting了,你还是使用的30pin的iphone1接口的数据线给它充电一样。

你会问,那要怎么弄?某个类你确实看它不顺眼了,还不能修改了?iPhone5当然可以使用更先进的Lighting接口,但是,请同时保留30pin的旧接口!一台iPhone弄2个充电接口,这手机也太奇怪了,所以Lighting接口刚出来的时候,有一个接口转换器,一头可以插30pin接口数据线,另一头是Lighting接口,问题就解决了。

回到编程的角度,你可以修改类,但是类的旧有接口一个都不要变,你只需要给它添加新的接口就行了。这样就确保了项目旧有的代码可以正确编译执行,同时你又为类添加了新的属性方法和事件。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注