VB备忘录(7)类与对象

VB备忘录(7)类与对象,第1张

概述先看一个C++简单的日期类定义: class TDate{ public: void SetDate(int y, int m, int d); int IsLeapYear(); void Print(); private: int year, month, day;}; C++类有:封装、继承、多态,  VB没有继承 VB中可设置或取得的值称:字段或属性        



先看一个C++简单的日期类定义:

class TDate{	public:		voID SetDate(int y,int m,int d);		int IsLeapYear();		voID Print();	private:		int year,month,day;};

C++类有:封装、继承、多态, VB没有继承

VB中可设置或取得的值称:字段或属性

区别:实现方式不同,属性是用一个过程来实现,这样就可以完成复杂的动作。

上面year相当于字段,SetDate()相当于属性

有时字段通过属性来进行访问,注意下面的简单类例。


通过类模块的方法来创建每一个类。类只含代码,没有GUI(界面)


类模块只有两个事件:Initialize Terminate


在每一个类中显式地用Option Explicite指明变量必须 显式声明是一个好习惯,并对每一个类名用cls或C来指明这是一个类的名字(就是类模块的名称)。

dim wakeUp as New CTime1


创建一个Ctime1类,三个实例变量mHour,mMinute,mSecond声明为Private,表示只能被类内进行访问。

(一般数据声明为Private,方法声明为Public,但这不是绝对的,比如前面的字段有时要外部访问时,就可声明为Public,只不过这样有风险,所以一般不这样做)

可以看到不是随便数据可以来设置分钟的,【0,59】是一个范围,如果用字段来设置就容易超范围而出错,用属性就可进行判断达到修正提示的作用。


在工程资源管事器内部右击,添加类模块,选中它,在下面属性中就可重命名为CTime1

SetTime(设置时间) ToUniversalTime(世界时) ToStandandTime(标准时)

类模块中代码:

Option ExplicitPrivate mHour As Integer  '类模块内可访问,类模块外不可访问Private mMinute As IntegerPrivate mSecond As IntegerPublic Sub SetTime(ByVal h As Integer,ByVal m As Integer,ByVal s As Integer) '类外亦可访问    mHour = IIf(h >= 0 And h < 24,h,0)    mMinute = IIf(m >= 0 And m < 60,m,0)    mSecond = IIf(s >= 0 And s < 60,s,0)End SubPublic Function ToUniversalTime() As String    ToUniversalTime = Format(mHour,"00") & ":" & Format(mMinute,"00") & ":" & Format(mSecond,"00")End FunctionPublic Function ToStandardTime() As String    Dim h As Integer    h = IIf(mHour = 12 Or mHour = 0,12,mHour Mod 12)    ToStandardTime = h & ":" & Format(mMinute,"00") & " " & IIf(mHour < 12,"AM","PM")End Function

在窗体上添加一command1,双击打开代码窗,添加:
Option ExplicitPrivate Sub Command1_Click()    Dim t As New Ctime1    Print t.ToStandardTime    Print t.ToUniversalTime        Print    Call t.SetTime(17,28,46)    Print t.ToStandardTime    Print t.ToUniversalTime        Print    Call t.SetTime(21,33,90)    Print t.ToUniversalTimeEnd Sub

按F5运行,即可显示相关时间


由上面例子可以看出:

1、类模块中最好用Option Explicit来显式地来声明每一个成员,这样避免不必要的错误。

2、Pivate仅类模块内访问,Pulbic还可在类模块外被访问,相当于是全局的。

同时把Private和Public分别进行集中放置,是一个好的习惯,这样查找修改更方便

3、Private在类外的实例中,不能访问,这就是封装。注意,const a as integer常量只能用Private

4、注意默认值,省略访问说明时,property,sub,function等默认为Public,实例变量默认为Private。




桥的作用

对于设置了Private的数据,又要想访问怎么办?正如C++一样,添加一个成员函数,这个成员函数Public的,它对类内可以访问Pivate数据,对类外又可被实例访问。

这样就架起了一桥,可以访问私有的数据,同时把一些判断语句加进来,使得更加合理。


在VB中这个桥有专门的语句:Property Get, Property Let, Property Set,它们在私有数据与实例对象中架起这个桥。

Property Get 取得数据

Property Set 设置数据,数据是对象时

Property Let 设置数据,数据是基本数据类型时(如上面例子的,mHour,mSecond等)


为什么要有获取和设置?这是因为应用的不同,有时要设置,有时要取出应用,如果某一个不应用的话,那只能单独地被设置或取出。

假定对mHour小时进行获取和设置:

Public Property Let hour(ByVal hr As Integer) '设置值,无须有返回值    mHour = IIf(hr >= 0 And hr < 24,hr,0)End PropertyPublic Property Get hour() As Integer '取出,有返回值,这个返回值一般将赋值给另一个变量    hour = mHourEnd Property

于下有了下面应用情况:

dim t as CTime1,x as integer

t.hour=23 ' 这是设置值,故必须有Property Set Hour的定义

x=t.hour ' 这是取出值,故必须要有Property Get Hour的定义

所在,在只允许读的属性中时,不会对Property Let(Set)进行属性定义,或者虽然定义,但用Private限制访问

在类中属性的设置或获取中可以用 Exit Property 退出过程

通过Property过程,可以把原本Private的数据,变相地变成了Public访问。这就是桥的妙用。


New的作用

New只能用在对象中,当指定一个对象类型并用New时,就会在内存中分配一块,相当于对象的“框架”(构造函数)

如果只是说明对象,而没有用New的话,相当于是一个nothing,什么也不是,如果引用它会产生错误,必须再用Set来设置其值

dim t as CTime1 ' 没有用New,它是一个nothing

x=t.hour ' 错误,nothing的对象是不是有值的

Set t=New Ctime1 ' 这是在声明对象类型后,再用Set进行赋值,然后用 x=t.hour才会有值。


类的合成

一个类中再次利用前面已经定义的另一个类,这种就叫类的合成,或者有些称为类的组合、包含。

实际上这个前面已经定义的类,可以把它当作基础类型一样对待就行了,它没啥了不起,脱了衣服还是一个类型同基础类型一样。

总结

以上是内存溢出为你收集整理的VB备忘录(7)类与对象全部内容,希望文章能够帮你解决VB备忘录(7)类与对象所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1280618.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存