首页 vbnet学习笔记(十二)继承中的构造事件共享方法共享事件

vbnet学习笔记(十二)继承中的构造事件共享方法共享事件

举报
开通vip

vbnet学习笔记(十二)继承中的构造事件共享方法共享事件PAGE/NUMPAGESVB.net学习笔记〔十二继承中的构造、事件、共享方法、共享事件〔复习备用一、构造函数继承对构造函数方法的影响与对常规方法的影响不同。1、不带参的构造函数用New来创建构造函数。它于创建对象时才运行一次。构造函数不会有Overridable,Overrides,因为对象都没创建,无法进行重写,所以如果使用这两个关键字会产生语法错误。所有不带参数的构造函数,写与不写,都不会影响继承。2、带参的构造函数带参的构造函数,在继承中变得复杂。因为子类的元素继承来自基类,如果基类都构造,那...

vbnet学习笔记(十二)继承中的构造事件共享方法共享事件
PAGE/NUMPAGESVB.net学习笔记〔十二继承中的构造、事件、共享方法、共享事件〔复习备用一、构造函数继承对构造函数方法的影响与对常规方法的影响不同。1、不带参的构造函数用New来创建构造函数。它于创建对象时才运行一次。构造函数不会有Overridable,Overrides,因为对象都没创建,无法进行重写,所以如果使用这两个关键字会产生语法错误。所有不带参数的构造函数,写与不写,都不会影响继承。2、带参的构造函数带参的构造函数,在继承中变得复杂。因为子类的元素继承来自基类,如果基类都构造,那么子类不可能产生。先看一下无参时:实际上子类构造函数中第一行代码是调用的是基类的构造函数。这个必须是第一行,并且只能占用一行。如果第一行不是这个显式地写出,则在后台,VB.net会插入一个对父类构造函数的有效调用。下例是手动显式写出:无参在注释里。〔Employee类中[vb]viewplaincopyprint?PublicSubNew<>MyBase.New<"George">'MyBase.New<>Debug.WriteLine<"EmployeeConstructor">EndSub构造函数也称ctor,在ILDASM或.NETReflector工具中经常用到这个术语。在继承链中,每个构造函数总将调用MyBase.New作为第一行,以保证本类的上一级得到有效的构造。再结合看一下带参的情况:怎么把参数带给上一级呢?上例中第一行用带参方法向上一级。使得上一级能正确使用参数构造。但上例用的是"具体"的参数值,这叫"硬编码",硬编码方式限制了程序的通用性,可用一些变量来增加程序的通用性:[vb]viewplaincopyprint?PublicSubNewMyBase.NewDebug.WriteLine<"EmployeeConstructor">EndSub〔上例Employee类中配合子类Employee传来的name参数,基类Person的构造函数如下:[vb]viewplaincopyprint?PublicSubNewMe.Name=nameDebug.WriteLine<"PersonConstructor">EndSub这样就完成了带参数函数的匹配。但上例中出现了一个严重的错误:Person中的Name属性被子类Employee重写且重载了。上面调用的是重写版本。重写版本在子类中,该版本不能使用Dictionary!!!因为类中任何使用New语句声明的成员变量,如Employee中Dictionary对象,只能在执行完该类的构造函数后,才会被初始化。这时正在执行Person的构造,所以无法执行Employee的构造,似乎是个死结。。。。为了解决此问题,须修改Employee类,应去掉字段中的New,改为在方法或属性中执行。修改如下:[vb]viewplaincopyprint?PrivatemNamesAsGeneric.DictionaryPublicOverloadsPropertyNameAsStringGetIfmNamesIsNothingThenmNames=NewGeneric.DictionaryReturnmNamesEndGetSetIfmNamesIsNothingThenmNames=NewGeneric.DictionaryIfmNames.ContainsKeyThenmNames.Item=valueElsemNames.AddEndIfIftype=NameType.normalThenMyBase.Name=valueEndIfEndSetEndProperty但这样又引发了OfficeEmploy中构造的错误,因为Employe中的参数name也要来自它的子类OfficeEmployee,故OfficeEmployee的构造函数:[vb]viewplaincopyprint?PublicSubNewMyBase.NewDebug.WriteLine<"OfficeEmployeeConstructor">EndSub因此这三个继承链上的类,构造情况如图:因此,继承链上的各类构造函数如果带参数,须仔细考虑上下级类的构造函数带参情况。仔细看一下构造中的 流程 快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计 :子类custom进入构造时,将调用父类Peron的构造,构造中会对New进行初始化,所以对mName初始化。父类构造完成后将返回子类中继续构造,这时对子类中的mName进行初始化,子类完成后,就完成了继承链中上的构造。二、ProtectedProtected是Pulic与Private的混合品种,对类外它Private,对类内〔继承链它是Public。Friend仅用于项目或组件中的代码ProtectedFriend派生类或项目内,或者两者绋可ProtectedFriend—Availabletocodewithinyourproject/componentandclassesthatinheritfromtheclasswhetherintheprojectornot.下面在Person增加如下Protected成员:[vb]viewplaincopyprint?PrivatemIDAsStringProtectedPropertyIdentity<>AsStringGetReturnmIDEndGetSetmID=valueEndSetEndProperty子类Employee添加:[vb]viewplaincopyprint?PublicPropertyEmployeeNumber<>AsIntegerGetReturnCIntEndGetSetIdentity=valueEndSetEndProperty可以看到继承后,在类内Protected成员可以象Public那样直接使用。Protected对类外的对象是不可见的,因此很好完成封装效果控制。三、继承中的事件在Person类添加事件:[vb]viewplaincopyprint?PrivatemNameAsStringPublicEventNameChangedPublicOverridablePropertyName<>AsStringGetReturnmNameEndGetSetmName=valueRaiseEventNameChangedEndSetEndPropertyEmploy类及OfficeEmployee类的Name属性:[vb]viewplaincopyprint?'============Employee类中Name属性代码=================PrivatemNamesAsGeneric.DictionaryPublicOverloadsPropertyNameAsStringGetIfmNamesIsNothingThenmNames=NewGeneric.DictionaryReturnmNamesEndGetSetIfmNamesIsNothingThenmNames=NewGeneric.DictionaryIfmNames.ContainsKeyThenmNames.Item=valueElsemNames.AddEndIfIftype=NameType.normalThenMyBase.Name=valueEndIfEndSetEndPropertyPublicOverloadsOverridesPropertyName<>AsStringGetReturnNameEndGetSetName=valueEndSetEndProperty'=============OfficeEmployee类中Name属性代码============PublicShadowsPropertyName<>AsStringGetReturnMyBase.NameEndGetSetMyBase.Name=valueEndSetEndProperty主程序中添加接收事件:[vb]viewplaincopyprint?PublicClassForm1PrivateSubbtnOK_ClickHandlesbtnOK.ClickDimtempAsEmployee=NewofficeEmployee<"zheng">AddHandlertemp.NameChanged,AddressOfOnNameChangedWithtemptemp.Name="Fred"EndWithEndSubPrivateSubOnNameChangedMsgBox<"NameChanged:"&newName>EndSubEndClass运行,执行顺序如下:可以看到,事件是可以继承的。结论:子类可以访问其基类中的事件,但子类中的代码不能直接用代码引发该事件。上例中不能用Employee或OfficeEmployee中的RaiseEvent方法来引用NameChanged事件。〔尽管Person中定义事件为Public,只有Person才能用RaiseEvent引发本类定义的事件。下例是Employee中用RaseEvent使用Person中的事件,将出错:[vb]viewplaincopyprint?PrivatemSalaryAsDoublePublicPropertySalary<>AsDoubleGetReturnmSalaryEndGetSetmSalary=value'RaiseEventDataChanged<"Salary",value>'出错,子类不能直接用语句引发基类事件EndSetEndProperty但,可用Protected把该语句包装成方法后,供后面子类调用该方法,从而间接激发:[vb]viewplaincopyprint?'==========基类Person用Protected方法来包装RaiseEvent================ProtectedSubOnDataChangedRaiseEventDataChangedEndSub'==========子类Employee中用调用方法的形式间接激发事件==================PublicPropertySalary<>AsDoubleGetReturnmSalaryEndGetSetmSalary=value'RaiseEventDataChanged<"Salary",value>'子类不能直接用语句引发基类事件OnDataChanged<"Salary",value>EndSetEndProperty这样,在子程序分别定义好接收事件,并关联好事件:[vb]viewplaincopyprint?PublicClassForm1PrivateSubbtnOK_ClickHandlesbtnOK.ClickDimtempAsEmployee=NewofficeEmployee<"zheng">AddHandlertemp.NameChanged,AddressOfOnNameChangedAddHandlertemp.DataChanged,AddressOfOnDataChanged'关联到事件temp.Name="Fred"temp.Salary=300EndSubPrivateSubOnNameChangedMsgBox<"NameChanged:"&newName>EndSubProtectedSubOnDataChanged'事件处理MsgBox<"New"&field&":"&CStr>EndSubEndClass注意的是主程序中接收事件OnDataChanged与类中的OnDateChanged是不一样的。因为类中的是Protected它只能在类内使用,不能对外。四、共享方法共享方法是类在加载时就被加载到内存中的方法,在整个运行过程中保持不变,因而不能重写。但非共享方法是在对象实例化时才单独申请内存空间,为每一个实例分配独立的运行内存,因而可以重写。同时注意到共享方法是类加载〔而不是对象实例化时就产生,且固定了内存位置,而非共享方法是对象实例化时再分配内存空间,其内存的地址是随即产生,无法定向,所以共享方法不能访问非共享方法。按照C++的说法,就是共享方法是没有This指针的。共享方法可以被继承,也可以被重载或隐藏,但不能重写!!下例用类名调用共享比较方法:[vb]viewplaincopyprint?'==============Person类中的共享方法,添加代码=====================PublicSharedFunctionCompareAsBooleanReturnperson1.Name=person2.NameEndFunction'==============主程序中调用程序===================PrivateSubbtnOK_ClickHandlesbtnOK.ClickDimemp1AsNewEmployee<"Fred">Dimemp2AsNewEmployee<"Mary">MsgBox>'继承共享方法EndSub继承与重载共享方法继续添加,以便共享方法在子类Employee中重载〔类型不一样:[vb]viewplaincopyprint?'==============Employee类中重载共享方法=====================PublicOverloadsSharedFunctionCompareAsBooleanReturnemployee1.EmployeeNumber=employee2.EmployeeNumberEndFunction'==============主程序中调用程序==========PrivateSubbtnOK_ClickHandlesbtnOK.ClickDimemp1AsNewEmployee<"Fred">Dimemp2AsNewEmployee<"Mary">emp1.EmployeeNumber=1emp2.EmployeeNumber=1MsgBox>'继承共享方法MsgBox>'重载比较EndSub显示为:False、True。因为第一个调用的Person版本的比较,第二调用的是Employee版本的比较。如果上面重载方法移动至OfficeEmploy中时,显示结果将是:False,False因为它们两个都会调用Person中的Compare方法,所以结果一样。隐藏共享方法虽然不能重写,但可隐藏,在OfficeEmployee中定义一个与父类Employee方法签名一样的共享方法[vb]viewplaincopyprint?'==============OfficeEmploy类中隐藏共享方法=====================PublicSharedShadowsFunctionCompareAsBooleanReturnperson1.Age=person2.AgeEndFunction'==============主程序中调用程序==========PrivateSubbtnOK_ClickHandlesbtnOK.ClickDimemp1AsNewEmployee<"Fred">Dimemp2AsNewEmployee<"Mary">emp1.Age=25emp2.Age=20MsgBox>EndSub结果:显示False尽管对象是Employee,例共享方法是通过类名调用,这里用的是OfficeEmployee,故用它的共享方法。虽然它也继承了上一级Employee的共享方法,但因隐藏原因,将使用本类的共享方法。五、共享事件1、共享事件可以被继承。象前面事件一样。2、同理子类中不能用RaiseEvent来引发父类的共享事件。只能象前面一样用Protected包装后,调用方法间接引发。
本文档为【vbnet学习笔记(十二)继承中的构造事件共享方法共享事件】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
机构认证用户
爱分享
通信工程;电信工程;电子工程;光线传输系统;移动通信;数字传输设备;信息网络及传真;工程监理;弱电设计安装;设备安装;
格式:doc
大小:31KB
软件:Word
页数:13
分类:成人教育
上传时间:2022-03-27
浏览量:13