ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3487|回复: 9

[转帖] 【转帖】 什么是类

[复制链接]

TA的精华主题

TA的得分主题

发表于 2009-12-9 22:02 | 显示全部楼层 |阅读模式
我不知道什么是类,网上搜到一个,有时间来看,也好与和我一样的坛子里的公民一起分享

(一)类的基本定义和应用概述;   
   
    类是包含了方法、属性、数据成员的高级代码模块,它既在模块的范畴之内,又是一个没有图形界面的Active   ocx,程序员可以象使用控件一样使用它,但却不能看到它,值得注意的是,类是不能继承的。   
  类能够使我们高效的完成对某一个或者某几个特定的对象的复杂操作,对象的动作就是类的方法,对象的属性就是类的属性过程。相对而言,如果编程的对象是一组事物,那么,我们采用标准模块的方式是非常合适的,在下列两种情况下,应该使用类进行代码处理:   
   
    (1)创建大量性质相近的对象;   
   
    (2)提高代码的封装性。   
   
    类的创建非常简单,在进行代码编写的时候,在“工程”菜单中选择“添加类模块”项目,就可以添加一个空白的类。   
   
       类文件一般以.cls作为扩展名保存。   
   
    (二)类的方法的实现;   
   
    类的方法类似于动态链接库的接口函数,它能够接受其他窗体代码的指定类型参数,并且传递到类中。一般来说类的方法是能够指定是否有返回值的。它在类中通常是一个public过程。请看下面的代码示例,它使一个密码框拒绝非字母的输入:   
   
    (1)类cls的代码;   
   
       Option   Explicit'变量检查      
        Private   WithEvents   mytxt   As   TextBox      
        '本类中的方法接受和控制一个text密码框     
        Dim   isNUM   As   Boolean      
        '类的模块级变量      
        Public   Sub   Attach(itTEXT   As   TextBox)      
        '接受外部变量到mytxt中      
        Set   mytxt   =   itTEXT      
       End   Sub   
   
       Private   Sub   mytxt_KeyUp(KeyCode   As   Integer,   Shift   As   Integer)      
      isNUM   =   (KeyCode   >=   65)   And   (KeyCode   <=   90)      
      '测试密码框的键盘输入是否是英文字母      
      If   isNUM   =   False   Then      
       Beep      
       mytxt.Text   =   ""      
       '如果输入不是英文字母则响铃并且清空密码框内容      
       MsgBox   "非法字符输入!"      
      End   If      
      Debug.Print   mytxt.Text   
   
      '调试输出密码框内容      
      End   Sub      
        '类的代码结束  
(2)类的引用;   
   
    已经编写完成的类可以经过两种格式进行引用,第一种方式:Private(public或者dim)   myCLS(指定的类名)   As   New   cls(编写完成的类名);第二种方式较多用于程序编写风格较“老”的程序员:首先在窗体代码中进行模块级声明──Dim   myCLS   As   cls,然后在具体代码过程中进行具体定义──   Set   mycls   =   New   cls。这两种方式的效率和代码的简洁性方面可能会有所差别,但在笔者的编程实践中,并没有什么特别的感觉,不过我较多使用第一种方式,因为它书写起来更加方便。另外,在代码结束的时候,使用   Set   myCLS   =   Nothing来取消类的资源占用是一种非常好的编程习惯。   
   
    在窗体form1中(窗体有一个密码框控件text1,passworldchar="*")添加以下代码:   
    Option   Explicit      
     Private   myCLS   As   New   cls      
     '引用cls      
     Private   Sub   Form_Load()      
     myCLS.Attach   Text1      
     '启动类   
    End   Sub   
   
    '在代码结束时记得释放资源      
    Private   Sub   Form_Unload(Cancel   As   Integer)      
     Set   myCLS   =   Nothing      
    End      
   End   Sub   
   
    本文代码展示了类的方法的代码编写过程和调用方式(尽管它和类的事件非常相似),它的效果是,如果密码框中被输入了非字母,则系统振铃,并删除密码框中的原来的数据──在一定程度上保护密码。   
  类的方法可以不需要任何参数,这一点类似一个public的函数或者过程,它也是类中使用最广泛的。在下一篇文章中我将讨论,如何使用类的属性、事件和方法进行综合编程.   
在Visual   Basic   6.0类的技术与应用(上)(以下简称上文)中,我们讨论了类的理论、类的创建和类的方法的编程实践,实际上,类之所以能够在软件工程中广泛应用,最主要的一点是它可以非常方便的封装许多编程需要的属性,这不仅使程序员在一定程度上克服控件(ocx)和链接库(dll)设计和调试中的复杂性,而且能够提高程序代码的简洁和高效性──本文将讨论完整的类的编程,包括方法、属性和基本事件。   
   
    (一)类的属性的特征和定义;   
   
    类似于标准控件的属性,类的属性允许用户在指定的数据范围内进行赋值,这些值被类内的各个代码部分所共享。属性的获得和传递需要经过   Property   Let和Property   Get语句进行编程,当然,我们首先需要在类中进行全局或者模块级的相应变量定义。   
   
    (二)事件的属性和基本定义;   
   
    和窗体的事件类似,类也有两个基本的事件,Class_Initialize(类加载时触发)和Class_Terminate(类卸载时触发),这两个事件都是private的。实际上,我们完全可以忽略这两个事件──只要你记得完善类的方法和属性。   
   
    类同样可以定义自己的事件,它和方法的程序编写格式类似,只不过需要WithEvents关键字进行参数声明,而且事件不能有任何命名参数或者可选参数,它也没有返回值。   
   
    实际上,结构良好的方法和属性完全可以替代结构复杂的类的事件。   
   
    (三)类的方法、事件和属性的编程实例;   
   
    本程序的设计目的是,通过类控制窗体中文本框的内容的全部大写、小写和逆向排序转化。   
   
    为了方便代码的书写和调用,我在类中引用了枚举的编程方法。   
   
    以下代码在类Class1:      
    Option   Explicit      
     Private   WithEvents   myTXT   As   TextBox      
     '方法的参数接口      
     Public   Enum   sTYLE      
      Lcaseit'小写属性      
      Lbigit'大写属性      
      Nlogoit'逆向排序属性      
     End   Enum   
   
    '自定义枚举,用来实现属性的自动赋值      
    Private   mvarBiaozhi   As   sTYLE      
    '实现枚举常量的连接      
    Public      dONE()   As   String'      
    'DONE方法用来根据指定的枚举属性,对      
    '窗体文本框进行相应的字符转化操作      
    '并且返回转化后的字符串      
    If   mvarBiaozhi   =   Nlogoit   Then      
     dONE   =   StrReverse(myTXT)      
     '逆向排序      
    ElseIf   mvarBiaozhi   =   Lcaseit   Then      
     dONE   =   LCase(myTXT)      
     '强制小写转化      
    Else      
     dONE   =   UCase(myTXT)      
     '强制大写转化      
    End   If   
    End      
   
    'DONE方法结束      
    Public   Property   Let   Biaozhi(ByVal   vData   As   sTYLE)      
     '获得属性的被赋的值      
     mvarBiaozhi   =   vData      
    End   Property   
        Public   Property   Get   Biaozhi()   As   sTYLE      
     '传递属性值到类中      
     Set   Biaozhi   =   mvarBiaozhi      
    End   Property   
   
    Public   Sub   Attach(itTEXT   As   TextBox)      
     '连接类的方法      
     Set   myTXT   =   itTEXT      
    End   Sub   
        Private   Sub   Class_Initialize()      
     '本事件在类倍加载时激活      
     MsgBox   "你好!本程序向您展示使用类的方法、属性、事件进行编程的技术!"      
    End   Sub      

    Private   Sub   Class_Terminate()      
     '本事件在类被卸载时激活      
     MsgBox   "你好!记得在Class_Terminate中填写对象撤销后的代码!"      
    End   Sub      
    '类的代码全部结束   
(四)窗体代码的引用编程;   
   
    在窗体FORM1中添加文本控件TEXT1、下拉列表控件COMBO1、命令按钮COMMAND1(CAPTION="开始转化"),调整三个控件到适当位置。   
   
    Dim   myT   As   New   Class1      
    '类的引用      
    Private   Sub   Form_Load()      
     Combo1.Clear      
     Combo1.AddItem   "字符串大写转化"      
     Combo1.AddItem   "字符串小写转化"      
     Combo1.AddItem   "字符串逆向排序"      
     Combo1.ListIndex   =   0      
     '在列表框中添加属性选项      
    End   Sub   
   
    Private   Sub   Command1_Click()      
     '当命令按钮按下时激活类      
     myT.Attach   Text1      
     '方法参数联接      
     Select   Case   Combo1.ListIndex      
      Case   0      
        myT.Biaozhi   =   Lbigit      
      Case   1   
            myT.Biaozhi   =   Lcaseit      
      Case   2      
        myT.Biaozhi   =   Nlogoit      
     End   Select      
     '根据列表框的选择,给类的Biaozhi属性赋值      
     '注意,在编程环境中,上述属性值自动添加   
   
     Text1.Text   =   myT.dONE      
     '返回排序结束后的字符串   
    End   Sub   
   
    Private   Sub   Form_Unload(Cancel   As   Integer)     
     Set   myT   =   Nothing      
    End   
        '良好的编程习惯   
   
    End   Sub      
  怎么样,我们的代码看起来如此的简洁,这种感觉就象是在使用一个控件,不仅可以随心所欲的调用,而且方便的使用了vb的自动提示功能。

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-12-9 22:05 | 显示全部楼层
【转帖】什么是类?类是如何定义的?
类是面向对象程序设计的核心,它实际是一种新的数据类型,也是实现抽象类型的工具,因为类是通过抽象数据类型的方法来实现的一种数据类型。类是对某一类对象的抽象;而对象是某一种类的实例,因此,类和对象是密切相关的。没有脱离对象的类,也没有不依赖于类的对象。

类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的操作封装在一起的集合体。这有点像C语言中的结构,唯一不同的就是结构没有定义所说的“数据相关的操作”,“数据相关的操作”就是我们平常经常看到的“方法”,因此,类具有更高的抽象性,类中的数据具有隐藏性,类还具有封装性。

类的结构(也即类的组成)是用来确定一类对象的行为的,而这些行为是通过类的内部数据结构和相关的操作来确定的。这些行为是通过一种操作接口来描述的(也即平时我们所看到的类的成员函数),使用者只关心接口的功能(也就是我们只关心类的各个成员函数的功能),对它是如何实现的并不感兴趣。而操作接口又被称为这类对象向其他对象所提供的服务。

类的定义格式:

类的定义格式一般地分为说明部分和实现部分。说明部分是用来说明该类中的成员,包含数据成员的说明和成员函数的说明。成员函数是用来对数据成员进行操作的,又称为“方法”。实现部分是用来对成员函数的定义。概括说来,说明部分将告诉使用者“干什么”,而实现部分是告诉使用者“怎么干”。

class <类名>

{

public:

<成员函数或数据成员的说明>

private:

<数据成员或成员函数的说明>

};

<各个成员函数的实现>

下面简单地对上面的格式进行说明:class是定义类的关键字,<类名>是种标识符,通常用T字母开始的字符串作为类名。一对花括号内是类的说明部分(包括前面的类头)说明该类的成员。类的成员包含数据成员和成员函数两部分。从访问权限上来分,类的成员又分为:公有的(public)、私有的(private)和保护的(protected)三类。公有的成员用public来说明,公有部分往往是一些操作(即成员函数),它是提供给用户的接口功能。这部分成员可以在程序中引用。私有的成员用private来说明,私有部分通常是一些数据成员,这些成员是用来描述该类中的对象的属性的,用户是无法访问它们的,只有成员函数或经特殊说明的函数才可以引用它们,它们是被用来隐藏的部分。

关键字public,private和protected被称为访问权限修饰符或访问控制修饰符。它们在类体内(即一对花括号内)出现的先后顺序无关,并且允许多次出现,用它们来说明类成员的访问权限。

其中,<各个成员函数的实现>是类定义中的实现部分,这部分包含所有在类体内说明的函数的定义。如果一个成员函数的类体内定义了,实现部分将不出现。如果所有的成员函数都在类体内定义,则实现部分可以省略。

案例:

案例说明

本例给出一个日期类定义的例子,来具体讲解类的概念和类的定义格式。使您更加清楚类的相关知识。

实现过程

class TDate

{

public:

void SetDate(int y, int m, int d);

int IsLeapYear();

void Print();

private:

int year, month, day;

};

//类的实现部分

void TDate::SetDate(int y, int m, int d)

{

year = y;

month = m;

day = d;

}

int TDate::IsLeapYear()

{

return(year%4==0 && year%100!=0) || (year%400==0);

}

void TDaterint();

{

cout<

}

这里出现的作用域运算符“::”是用来标识某个成员函数是属于哪个类的。

该类的定义还可以如下所示:

class TDate

{

public:

void SetDate(int y, int m, int d)

{year=y; month=m; day=d;}

int IsLeapYear()

{return(year%4==0 && year%100!=0) || (year%400==0);}

void Print()

{cout<

private:

int yeay, month, day;

}

这样对成员函数的实现(即函数的定义)都写在了类体内,因此类的实现部分被省略了。如果成员函数定义在类体外,则在函数头的前面要加上该函数所属类的标识,这时使用作用域运算符“::”。

TA的精华主题

TA的得分主题

发表于 2009-12-9 22:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
支持分享。。。。

TA的精华主题

TA的得分主题

发表于 2009-12-9 22:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
正在学习这方面的东西。
楼主辛苦了。

TA的精华主题

TA的得分主题

发表于 2009-12-9 23:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
类就是一类型相似的东东,它们有同样的属性,方法和事件
就好象电脑是一个类,我并没说是哪一台电脑。电脑都有内存、硬盘型号等属性,都有一加电就启动的事件。哈,并不恰当罢!具体说某一台电脑,即是一个对象,或者说是实例。所以对象是类的一个实例。

TA的精华主题

TA的得分主题

发表于 2011-9-25 20:25 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-11-17 22:21 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-11-17 22:38 | 显示全部楼层
“谁是人类?”,我们都举手,因为我们都人类的基本特征
“谁是李小龙?”,应该没有人举手,因为那个实例已经不在这个世间了。

TA的精华主题

TA的得分主题

发表于 2013-6-21 14:15 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-6-21 16:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
学习,留存
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-5 02:04 , Processed in 0.049349 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表