VB编程语言入门学习.doc_第1页
VB编程语言入门学习.doc_第2页
VB编程语言入门学习.doc_第3页
VB编程语言入门学习.doc_第4页
VB编程语言入门学习.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

来自;/dxcyyswgVB.NET之旅(一)失踪的窗体好久没有新作,架不住兄弟们的问询与诘问,只得拿些旧作来补上近来没空写 作的缺乏。羞愧ing!这一系列与Henry手记系列不一样,是一个人物办法的情形故事 ,开端发表于计算机国际,适用于VB.net初专家,老鸟们就不必在我这一系 列的文章上浪费时间了。我期望自个有时间今后,能不断持续这一系列的文章, 参加许多的工程处理方案。一起,我的Henry手记也会持续写下去,以报答长时间以 来撑持我的一切兄弟。布景:我叫Henry,刚从大学计算机专业结业,新 参加索易公司的.NET开发小组;担任带我的喽罗是大李,.NET高手,是个诙谐又有 耐性的家伙;老白是咱们有些的头头,常常带给咱们乖僻又难缠的需求。榜首天上班,白司理就带着我去.NET技能小组签到。“大李,这是新来的同 事,你要多帮帮他。”老白指着我对一个眼镜后边透着闪闪目光的年轻人说 。“没疑问,他会做得极好的。”大李莫非会看相不成?仍是 人家谦让呀?不论了,我只需自个尽力就对了。20分钟后,我现已在分配 给我的一台P4电脑,WindowsXP平台下翻开了Visual Studio.NET的集成编译环境 (IDE)开端赏识了。一个多美丽的编译环境呀,能够自选运用时的个性是VB6的还 是VC6的。我挑选的是RAD功用好的VB6个性。“你刚开端触摸.NET, 在系统训练之前先加深点形象,看看VB.NET与VB6有啥不一样吧。你创立两个窗体,每个窗体上各有一个按钮,点击时躲藏其地址的那个窗体,切换出另一个窗体 来。”大李的声响在耳边响起,打断了我对IDE的赏识。但他提的需求也太 简略了吧,在VB6中只需求两句写在按钮的单击呼应中的句子就行了:两 个窗体:Form1与Form2。Form1上的按钮为: Command1,Form2上的按钮为: Command2PrivateSubCommand1_Click()Me.HideForm2.ShowEndSubPrivateSubCommand2_Click()Me.HideForm1.ShowEndSub所以,我毫不犹豫地在VS.NET中内开端我的榜首个VB.NET的项 目了。首要,新建了一个VB.NET的Windows应用程序项目,主动生成了一个 Windows Form:Form1,在其上参加一个按钮控件:Button1;然后,增加了一个 Windows Form:Form2,在其上参加了一个按钮控件:Button2。在描绘窗口 双击Button1后,编译器会切换到代码窗口的Button1的单击呼应代码中。在代码段中故计重施,当我想写Form2.Show时,在Form2之后打个点,呈现的智能 感知菜单中,却没有Show这一办法。真新鲜,这怎样能够?莫非VB.NET改动有这 么大。我昂首看了看站在我身旁的大李。大李马上面露浅笑,看来是正中 他的骗局。他手指向屏幕,点了点Form1中的代码的最初处:PublicClassForm1InheritsSystem.Windows.Forms.Form不笨的我马上就知道 了,如今的Form1是一个从System.Windows.Forms.Form承继下来的类了,调用的 时分当然需求先实例化了,哈,也不难嘛。马上动手:PrivateSubButton1_Click(ByValsenderAsSystem.Object,_ByValeAsSystem.EventArgs)HandlesButton1.ClickMe.Hide()Dimfrm2AsNewForm2()实例化Form2类,得到一个目标frm2.Show()EndSub在Form2的Button2的单击工作中也相似地写了一段代码,运转 一下,和VB6的效果差不多了。正在得意中,大李走过来,在我的Form1中增加了 一个文本框textbox1,清空其间的文字。然后运转了一下程序。在运转中,他在 文本框里写了几个字:“Henry的著作”,然后点击Button1切换到 Form2,接着点击Button2,从头呈现的Form1的文本框中却变成了空白。“这”我一时语塞,慢慢地想起点啥, “大概是程序经过New布局办法,每次点击按钮都会从头实例化一次Form类 吧?所以每次从头呈现的窗体都不是从前从前呈现过的那个。那从前的窗体也就 失踪了,调不出来了。”“失踪?”大李不由笑了起来 ,“对呀,失踪在内存中。你每实例化一次,系统就会拓荒一块内存给一个 目标,并会有相应的线程对其进行操控与办理。若是作为进程中主线程的榜首个 Form1被Hide起来,没有封闭它,那么即便你封闭后来新创立的一切窗体,进程也 不会被间断。那么,用啥办法去找回你失踪的窗体,或许说怎么就只运用一 个目标,不再每次实例化呢?”“大局目标!”我脱口 而出,感受到大李模棱两可,只好硬着头皮持续说:“运用大局变量,使 Form1与Form2只实例化一次,这样就能够了。”然后,在大李的注 视下,我开端施行我的方案:再创立一个模块文件:module1.vb,并且同 时在:处理方案办理器-项目名.sln -右点鼠标 -特点 -通用属 性-惯例-发动目标 -改为Module1。让程序发动后先运转Module1中的 代码指令,然后编写代码如下:Module1.vbModuleModule1Publicfrm1AsNewForm1()界说Form1的共用变量实例Publicfrm2AsNewForm2()界说Form1的共用变量实例SubMain()Application.Run(frm1)这句话标明程序发动了modele后,会接下来运转frm1,即form1的一个实例。主线程就变成运转期的frm1了。EndSubEndModule这样一来,frm1、frm2就变成大局变量了,在Button1与 Button2的单击呼应代码中只需写:frm1.show就能够了。再运转程序,可 以了,“Henry的著作”一向都会保持在Form1中的文本框里。大李老哥没等我欢笑起来就再次出手,在frm1躲藏起来的时分,封闭了Form2窗口 (frm2实例),桌面上啥窗体都没有了,进程又一次被堕入在无法间断的状况 下。My God,面向目标的VB.NET,爱你莫非真的这么难VB.NET之旅(二)布局与析构在Form1窗体的实例被躲藏的时分,封闭了Form2窗体的实例,使我失去了 对主线程的人工操控,进程无法正常封闭了。只好运用Ctrl+Alt+Del调出系统进 程办理器,强行间断了该进程。为了防止昂首看见大李的笑脸,我只好垂头想办 法。有了,我只需能截获Form2实例封闭的音讯,不就能够再调出躲藏的 主线程窗体了吗?在Form2的基类事件(Base Class Event)中重载Closing办法进 行处置:PrivateSubForm2_Closing(ByValsenderAsObject,ByValeAs_System.ComponentModel.CancelEventArgs)HandlesMyBase.Closingfrm1.Show()EndSub哈,很便利,我封闭了Form2窗体的实例后,被躲藏 的那个frm1又呈现了。“嗯,”大李总算发话了,“你 再点击一下Form1窗体上的Button1试试。”我背心一凉,隐约感受 大李等待着的即是这个时分。无法的我还只能照他说的去做。公然,弹出一个出错窗口.“你封闭了frm2这个Form2的实例,也就完毕了这个目标的生存期 ,”大李看来是蓄势已久了,“这即是犯错提示中所说的无法 拜访名为Form2的已处置目标。当咱们封闭一个窗口的时分,会宣布一个 终止呼应,并将该窗口目标,就象上面界说的frm2,送入停止行列,公共言语运 行库的废物收回器盯梢着这个目标的生存期,此刻就会调用此目标基类,比方 Form2的Dispose办法,用于毁掉目标并收回资源。所以 ”“所以我只需判别一下frm2是不是被毁掉就 行了,若是毁掉了,我就再布局一个实例不就行了?”我恍然大悟道。大李首次浅笑地址了答应说:“用frm2.IsDisposed就能够来判别 了。”我心照不宣地写道:PrivateSubButton1_Click(ByValsenderAsSystem.Object,_ByValeAsSystem.EventArgs)HandlesButton1.ClickIffrm2IsNothingOrfrm2.IsDisposedThen判别目标是不是被毁掉frm2=NewForm2()EndIfMe.Hide()frm2.Show()EndSub这下完善多了,两个窗体之间的切换也不会有这么多 别扭的疑问了。我转过身,看到大李现已找了把椅子坐在我的身边。“你来说说,对VB.NET的窗体实例的创立与毁掉的进程吧。 ”我整理了一下杂乱的思路,长吁了一口气,开端说:“一个 窗体类,比方Form1类是经过调用其基类,就是Form类的New办法来创立实例、 Dispose办法来毁掉实例。”“没错。”大李边说话,一 边在我的程序中点击开来被代码窗口主动折叠起来的 Windows 窗体描绘器生成 的代码 :PublicSubNew()MyBase.New()该调用是Windows窗体描绘器所必需的。InitializeComponent()在InitializeComponent()调用之后增加任何初始化EndSub窗体重写处置以整理组件列表。ProtectedOverloadsOverridesSubDispose(ByValdisposingAsBoolean)IfdisposingThenIfNot(componentsIsNothing)Thencomponents.Dispose()EndIfEndIfMyBase.Dispose(disposing)EndSub大李开端说明道:“MyBase 关键词的行动相似 于引证类的当时实例的基类的目标变量。MyBase 常用于拜访在派生类中被重写或 躲藏的基类成员。在这段代码中,MyBase指的当然即是System.Windows.Forms.Form类了。布局目标时用的New办法是显式调用的,没什 么好说明的。但析构的办法值得一说。”他看了我一想,持续说: “Form.Dispose办法是重写自Control.Dispose办法的,那么 Control.Dispose办法的含义又是怎么的?它的效果即是:开释由Control占用 的非保管资源,还能够另外再开释保管资源。当它参数中的disposing 为 true 则开释保管资源和非保管资源;为 false 则仅开释非保管资源。Form类的 disposing为true。在封闭窗体时主动调用dispose的功用是得益于.net的公共语 言运转库,运行库主动处置目标规划和办理对目标的引证,当不再运用目标时释 放它们。其生存期以这种办法来办理的目标称为保管数据。主动内存办理消除了 内存走漏以及其他一些常见的编程过错。任何类型的Dispose 办法都大概开释它 具有的一切资源。它还大概经过调用其父类型的 Dispose 办法开释其基类型具有 的一切资源。该父类型的 Dispose 办法大概开释它具有的一切资源并一样也调用 其父类型的Dispose 办法,从而在整个基类型层次布局中传达该办法。要保证始 终正确地整理资源,Dispose 办法大概能够被屡次安全调用而不引发任何反常。 ”“可是,若是系统疑问或应用程序调用上出了疑问,不能正 常调用Dispose怎样办?”我想起了啥,问道。“若是经过 Dispose还开释不洁净或没有调用Dispose,系统的废物收回器会调用目标的 Finalize 办法进行铲除。由于履行 Finalize 办法会大大减损功用,所以咱们不 会一开端就用它去进行铲除作业。”大李略微说明了一下。我总算 想起了一个重要的疑问:“若是总是在模块中界说的大局变量来处置,由于 拜访规模太大,会不会有安全性的疑问?”“当然,咱们能够 试试其他的处理方案。”总是有备而言。VB.NET之旅(三)同享成员一起对VB.NET充满了猎奇与晓得的巴望。“除了大局变量外,还有啥好办法吗?”我迫不急待地想知 道成果。“能够运用同享成员。”大李依然是那么淡漠然, “VB.NET如今是撑持真实的面向目标编程,能够承继、运用多态、同享成员 和静态成员。同享成员即是在一切类和所界说派生类的实例之间同享的办法、属性、字段和工作。一切运用类创立的目标都能够拜访一样的数据、同享完结进程 ,并且收到一样的激起工作。”“这么好呀,那怎样完结呢? ”我好象又回到了课堂上,满脑都是无知的符号。“很简略, 在Public或Private成员润饰符后加上Shared关键词即可了。Shared关键词指示一 个或多个被声明的编程元素将被同享。同享元素不关联于某类或布局的特定实例 。能够经过运用类名或布局称号或许类或布局的特定实例的变量称号限制同享元 从来拜访它们。你来看这段代码PublicClassShareClassPublicSharedSharedValueAsStringPublicSharedSubShareMethod()MsgBox(Thisisasharedmethod.)EndSubEndClassSubTestShared()DimShared1AsNewShareClass()创立了类的一个实例.DimShared2AsNewShareClass()创立了类的第二个实例.Shared1.SharedValue=ShareValue1给同享字段赋值.Shared2.SharedValue=ShareValue2重写同享字段的值ShareClass.ShareMethod()不必创立实例就能够调用类的办法.EndSub“有两个关键,一个是同享成员若是是办法或特点,我 们不必创立实例就能够直接用类名.共享成员的办法进行调用;第 二个关键,同享字段是仅有的,你来说说运转后Shared1.SharesValue的值是多少 ?”我脑筋里转了两圈,已然说同享字段是仅有的,那么 Shared1.SharedValue和Shared2.SharedValue其实对应的是同一个同享字段,所 以么,我马上大声说:“是Share Value 2。由于被Shared2.SharedValue修 改了。”“没错!”大李又一次绽放了会意的浅笑,真 是对我的最高奖励。“那你还不着手修正一下你的程序?”好 !说做就做。已然同享特点在其调用的时分是不必实例化的,那么我最佳能凭借 布局一个同享特点来完结。并且要能够判别其实例是不是存在或是不是被毁掉,若是 不存在就布局一个新的窗体实例,若是存在就对其进行调用:PrivateSharedm_vb6FormDefInstanceAsForm1PublicSharedPropertyDefInstance()AsForm1GetIfm_vb6FormDefInstanceIsNothingOrElse_m_vb6FormDefInstance.IsDisposedThen判别窗体实例是不是存在m_vb6FormDefInstance=NewForm1()EndIfDefInstance=m_vb6FormDefInstanceEndGetSet(ByValValueAsForm1)m_vb6FormDefInstance=ValueEndSetEndProperty在Form2中也参加相似的代码,只不过把Form1改为Form2 。调用它是如此的便利:/Form1中的代码PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.ClickMe.Hide()Form2.DefInstance.Show()EndSub/Form2中的代码PrivateSubButton1_Click(ByValsenderAs_System.Object,ByValeAsSystem.EventArgs)_HandlesButton1.ClickMe.Hide()Form1.DefInstance.Show()EndSubPrivateSubForm2_Closing(ByValsenderAsObject,_ByValeAsSystem.ComponentModel.CancelEventArgs)_HandlesMyBase.ClosingForm1.DefInstance.Show()EndSub赶忙运转一下,不对呀,榜首个窗体里文本框改为 “Henry的著作”后,再切换仍是不见了?我疑问地昂首看了看大李。“你再好好想想,首次发动的是啥?”大李模糊地说了一 句。“首次发动的是作为主线程的Form1窗体呀!”我嘟啷 着说。“那么Form1.DefInstance在哪呢?”大李这句话真是 吵醒梦中人呀!我马上着手:ModuleModule1SubMain()Application.Run(Form1.DefInstance)EndSubEndModule并把Module1设为发动项目。运转运转哈 哈,一切都满意!我开端喜爱上VB.NET了。VB.NET之旅(四)类和布局刚上班,就被大李找去了。“Henry,昨日对窗体的操作给你最大的领会 是啥?”“当然有领会,最深的形象即是VB.NET中类是无所 不在了,连窗体都变成了一个类。”我深有感受地说。“没错 ,类是咱们用来布局VB.NET应用程序时的最基本的编程布局了。你也学习过最基 本的面向目标编程了,那么你能告诉我,布局与类有啥相似之处与不一样之处吗 ?”“好的。”我口中答复着,心里仍是有点不以为然 ,“布局和类,都是对成员的封装办法,可是类能够撑持承继 ”大李一边点着头,一边听我说,听到我结尾支 吾着没了声响才抬起头“还有呢?”“没了。”我 这时才开端心中发慌。“呵呵,一样之处我想你心中仍是知道的, 它们都富含成员,包括布局函数、办法、特点、字段、常量、枚举和工作。都可 以完结接口,都有同享的布局函数。”“对不住,结尾那一句 ,都有布局函数是啥意思?布局的布局函数我从来没有自个界说过。 ”大李马上写下了这一段代码:StructureSHenryPublicx,yAsIntegerPublicSubNew(ByValxAsInteger,ByValyAsInteger)Me.x=xMe.y=yEndSubEndStructureSubmain()DimH1AsSHenry=NewSHenry()DimH2AsSHenry=NewSHenry(2,1)EndSub“真的呢,能够完结布局的布局函数!”我还一向 没有注意过这个疑问。“可是,你只界说过一个带参数的布局函数,H2的实 例化我是知道的,可是H1怎样也能经过编译器检测呢?”其实我心中更想问 的是布局怎样也能实例化成目标,那和类真的很象呀。“缘由么, ”大李推了推眼镜,“每个布局都隐式地具有 Public 无参数实例构 造函数,该布局函数产生布局的默许值。所以你平常不写布局函数,也一样能够 New出一个布局来,对吧?事实上,咱们反而在布局类型声明中不行能声明无参数 实例布局函数。只能声明参数化实例布局函数。 ”“都能够用new来实例化,布局和类在内存分配上莫非也是 一样的吗?”这个疑问我一向挺不知道,正巧借这个论题问一下。“在这上面,不一样可就大了。”看到大李满面笑容的姿态,我 就晓得问到点子上了,马上摆开姿势,作仔细倾听状。“简略来说 ,布局是值类型,而类是引证类型。因而,布局运用仓库分配,类运用堆分配。 ”看到我苍茫的双眼,大李笑了笑,在电脑上飞快地写了个示例:ClassCHenryPubliczAsInteger=0能对非静态成员初始化也是一个差异EndClassSubmain()DimH1AsSHenry=NewSHenry(0,2)赋给H1.x=0DimH2AsSHenry=H1H2.x=26DimR1AsNewCHenry()R1.z也是等于0DimR2AsCHenry=R1R2.z=26Console.WriteLine(H1.x=&H1.x&,H2.x=&H2.x)Console.WriteLine(R1.z=&R1.z&,R2.value=&R2.z)EndSub“你看一下成果大概是啥?”大李一边说,一边 运转了程序:H1.x=0,H2.x=26R1.z=26,R2.value=26 “这即是值类型和引证类型的不一样。布局的实例 H2.x 赋值并不影响H1.x, 这是由于尽管它们同归于一种SHenry布局,但它们都有各自的存储空间。相反, 给 R2.z赋值26后;则会影响R1 和 R2 都引证的目标”“说得 更知道一点,类作为引证类型,是存储在运转时的堆上,只能经过引证该存储来 拜访它们,不能直接拜访。引证类型的变量总是包括该类型的值引证,或包括空 引证。空引证不引证任何内容;除分配空引证外,对空引证进行的任何操作都是 无效的。引证类型的变量赋值只会创立引证的一个副本,而不是所引证的值的副 本。它们实践上都是会指向同一块存储区的。”大李手指了指运转的成果。“布局是直接存储在仓库上,要么在数组中,要么在另一个类型中 。当包括布局实例的方位被毁掉时,布局实例也会被毁掉。值类型总是能够直接 拜访。咱们不能创立对值类型的引证,也不能引证已毁掉的值类型实例。值类型 的变量总是包括此类型的值。与引证类型不一样,值类型的值不能为空引证,也不 能引证派生附近程度较大的类型的目标。值类型的变量赋值会创立所赋的值的副 本,当然会新拓荒一块内存区来保管值。”“哦,我知道了。 它们还有啥差异没有?”我对布局和类的差异首次有了深入的感受。“当然有许多,比方一切的布局成员都默以为 Public,类变量和常 量默以为 Private,其他的类成员默以为 Public;布局成员不能声明为 Protected,类成员能够;布局进程不能处置工作,类进程能够;结构变量声明不 能指定初始值、New 关键词或数组初始巨细,类变量声明能够。”大李喝了 口水,停了一下,然后持续说。“布局从不停止,所以公共言语运 行库从不在任何布局上调用 Finalize 办法;类可由废物收回器停止,废物收回 器会盯梢未完结的引证直到某个特定的实例,当检测到没有剩余的活动引证时, 废物收回器将在类上调用 Finalize。”“这个我能够知道, 由于布局是值类型,是由系统统一办理内存,不是引证,所以不会对内存形成危 害。”我接着说了两句。“还有,你方才也说到了它们之间一 个很重要的差异:布局是不行承继的,而类能够承继。其实布局自身是从 ValueType 类隐式承继下来的。数据类型可分为值类型和引证类型。值类型要么 是仓库分配的,要么是在布局中以内联办法分配的。引证类型是堆分配的。引证 类型和值类型都是从结尾的基类 Object派生出来的。当值类型需求充任目标时 ,就在堆上分配一个包装,该包装能使值类型看上去像引证目标一样,并且将该 值类型的值仿制给它。该包装被加上符号,以便系统晓得它包括一个值类型。这 个进程称为装箱,其反向进程称为撤销装箱。装箱和撤销装箱能够使任何类型像 目标一样进行处置。”“哦,我知道为啥布局也能被实例化 成目标了!”我心中喜不自禁。“类的承继我在用C+和Java时也常常 运用,可是VB6是不撑持承继的,前次您说到VB.NET能够撑持承继了,它是怎样做 到的呀!”VB.NET之旅(五)类的承继“类的承继?”大李点答应,“从前许多人批判VB的功用不 完善时,都会加上这个条件。可是如今VB.NET中现已是比较完善的面向目标编程 办法了。方才咱们也说到过,类与 VB.NET 的布局相似,让咱们能够界说封装一 组有关项的数据类型。然而与布局的一个重要差异即是,VB.NET 类能够承继和扩 展其他类的特性。作为新类的根底的类称为基类。从基类派生的 类称为派生类。派生类承继基类中界说的一切字段、特点、办法 和工作。你看,咱们只需对类进行一次开发和调试,就能够将其作为其他类的基 础重复运用。”“类的承继的概念我学过的,在VB.NET中是如 何来实践演练呢?”我仍是坚持着问。“我写段代码给你看一 下吧,俗语不是说,百闻不如一见吗?”大李戏弄了两句,噼噼啪啪地开端 敲打起键盘来:PublicClassCBaseHenryPrivatexAsInteger=10ProtectedyAsIntegerSubNew()Console.WriteLine(基类的布局)EndSubProtectedOverridesSubFinalize()Console.WriteLine(基类的析构)MyBase.Finalize()EndSubPublicOverridableFunctionGetY(ByValxAsInteger)AsIntegerMe.y=me.x+xprivate类型的me.x只能在基类中运用Console.WriteLine(基类的GetY办法,成果为:&Me.y)ReturnMe.yEndFunctionPublicSubOldY()Console.WriteLine(基类的OldY办法)EndSubEndClass“你看,这是一个基类,我再给你写个承继自该类的 派生类。”他一边说一边持续写:PublicClassCDerivedHenryInheritsCBaseHenrySubNew()MyBase.New()注意:这句话要放在sub内的榜首句Console.WriteLine(派生类的布局)EndSubProtectedOverridesSubFinalize()Console.WriteLine(派生类的析构)MyBase.Finalize()EndSubPublicOverridesFunctionGetY(ByValxAsInteger)AsIntegerMe.y=x*10protected类型的me.y却能够在派生类中使用Console.WriteLine(派生类的GetY办法,成果为:&Me.y)ReturnMe.yEndFunctionPublicSubNewY()Console.WriteLine(派生类的新办法)EndSubEndClass“你看清了吧,咱们经过声明Inherits关键词,来标 识该类的基类是谁,若是没有标识的类,比方CBaseHenry,VB.Net就会视其为派 生自Object基类,这是种隐式承继,和布局是隐式承继自ValueType 类的办法是 一样的。”大李指着屏幕跟我说明着。“那这些overrides与 overload标识是啥意思呀?”我隐约感受到它们的含义,却无法知道地说 出来。“咱们运用承继,也要答应派生类中的某些特点或办法有与 基类不一样的行动,咱们想重写它,但基类也得要附和你才干重写 呀,不然不就会发作命名抵触了吗?由于派生类的目标是能够运用基类的共用成 员的,那怎样晓得哪些基类的办法与特点是被派生类重写了呢?所以就有必要有一 个约好:咱们在基类顶用Overridable润饰符来标识答应基类中的特点或办法在其 派生类中被重写,没有标识的其实即是默以为有NotOverridable润饰符来隐式地 标识,用于提示编译器该特点或办法不行被重写;然后在派生类重写时,咱们就 用Overrides润饰符来标识哪些是重写自基类中界说的 Overridable 特点或办法 。”大李娓娓道来,“咱们来演练一下对派生类的操作吧。 ”PublicSubMain()DimobjAsCDerivedHenry=NewCDerivedHenry()obj.GetY(4)调用派生类的GetY办法obj.OldY()调用基类的oldY办法obj.NewY()调用派生类的NewY办法EndSub然后大李按了一下F5键,在“输出”窗口中就呈现 了如下的运转成果:基类的布局开始运转NewCDerivedHenry()派生类的布局派生类的GetY办法,成果为:40obj.GetY(4)的运转成果=4*10,不等于基类的(4+10)基类的OldY办法obj.OldY()的运转成果派生类的新办法obj.NewY()的运转成果派生类的析构基类的析构“你看,你只在Main中实例化了一个派生类的对 象,为啥先会呈现基类的布局?”大李问。“这个么,”我开端在代码中检查起来,“是这句了。 ”我手指着派生类里的这段代码:SubNew()MyBase.New()注意:这句话要放在sub内的榜首句Console.WriteLine(派生类的布局)EndSub“没错,咱们有必要要注意这一点,即是派生类的布局函 数与析构函数都有必要从头编写。New 布局函数通常用于翻开文件、衔接到数据库 、初始化变量以及处置任何需求在可运用目标前完结的其他使命。咱们有必要在Sub New 布局函数中的榜首行代码运用句子 MyBase.New(),来调用类层次布局中该类 的基类的布局函数,以取得基类的性质。析构则是在Sub Finalize中履行完对派 生类的的整理使命,如保管状况信息、封闭文件和与数据库的衔接,以及履行在 开释目标前有必要完结的其他使命之后,在析构函数的结尾一句运用句子 MyBase.Finalize() 显式调用其基类的 Sub Finalize 办法,以析构MyBase.New ()布局的内容。所以你从程序运转成果中也能够很知道的看出这一次序。” 大李敲击着屏幕,象是给我提个醒。“知道了,我会记取的。 ”我诚实地址头回应着。大李俄然想起了啥,昂首对我说: “讲到类的承继,咱们还得看一下重载与躲藏的疑问。”VB.NET之旅(六)重载与躲藏大李坐在转椅上左右晃动着,手中的一个硬币在他指间灵活地翻滚着。 “hi, Henry。你对重写与重载的意思知道是怎么的呢?”我正盯着他手中的硬币发呆呢,“哦,重写,即是您方才举的示例中,在派 生类顶用Overrides从头编写有Overridable标识的基类的办法或特点;重载么, 即是咱们能够用一样的称号,在一个类顶用不一样的参数列表来创立多个办法和属 性,在调用时就能够习惯不一样参数类型的需求。”“在一个类 中创立?”大李的左眉向上一挑,我就晓得我能够说错了。可是,好象没有 说错啥呀。“那好,你看一下,这样的写法会有啥成果?”PublicClassCBaseHenryPublicSuboldY()Console.WriteLine(基类的oldY办法)EndSubEndClassPublicClassCDerivedHenryInheritsCBaseHenryPublicOverloadsSuboldY(ByValjAsInteger)Console.WriteLine(派生类的oldY办法)EndSubEndClassPublicSubMain()DimobjAsCDerivedHenry=NewCDerivedHenry()然后大 李写了obj.oldY这时呈现的智能感知菜单上呈现了参数列表:“咦,第二个oldY()无参数进程签名大概是基类界说的呀。为什 么在派生类的实例中也会呈现呀!”我不由猎奇起来。“没错 。还记得我前次曾显式编写布局函数的事吗?我用了一个mybase.new()用于承继 下基类的性质。如今没有写,其实是一种默许的隐式调用。”大李一说我就 知道了,其实如今的派生类大概是内含两个oldY办法了,无参数的oldY()其实就 是基类的办法,是由于Overloads和Mybase.new()两层效果的影响。“那你再看这样的改变状况。”大李象是看出我现已知道了这 个疑问。他在派生类中增加了一个用Overloads标识的与基类办法共同的无参数 oldY()。PublicClassCBaseHenryPublicSuboldY()Console.WriteLine(基类的oldY办法)EndSubEndClassPublicClassCDerivedHenryInheritsCBaseHenryPublicOverloadsSuboldY(ByValjAsInteger)Console.WriteLine(派生类的oldY办法1)EndSubPublicSuboldY()Console.WriteLine(派生类的oldY办法2)EndSubEndClassPublicSubMain()DimobjAsCDerivedHenry=NewCDerivedHenry()obj.oldY()EndSub“好的,如今你再说说看,如今的obj.oldY()的运转 成果会打印出啥?”大李手按在F5运转键上问我。“大概是 派生类的,不对,基类,呃,派生类”我一会儿就晕了。“呵呵。”大李也不由发笑起来。然后点击了一下F5键。成果 是:派生类的oldY办法2“这就叫躲藏,咱们用 overloads办法,躲藏了基类的同名办法。以防用户发作混杂。通常来说,躲藏有 两种状况,一种是经过规模来完结。比方你界说一个大局变量x,但在一个办法中 ,你又界说了一个局部变量x,在办法中运用x时,运用的是局部变量的那一个, 也即是用局部变量x在办法中躲藏了大局变量x。另一种状况,即是经过承继来隐 藏,办法么,除了方才用的overloads,还能够用Shadows关键词来完结。 ”“Shadows?暗影?却是很恰当的姓名。这个是怎样用的呢 ?”我爱好由然而生。“Shadows功用很强的。”说着, 大李又开端修正方才的代码了。PublicClassCBaseHenryPublicSuboldY()Console.WriteLine(基类的oldY办法)EndSubEndClassPublicClassCDerivedHenryInheritsCBaseHenryPublicShadowsSuboldY(ByValjAsInteger)Console.WriteLine(派生类的oldY办法)EndSubEndClassPublicSubMain()DimobjAsCDerivedHenry=NewCDerivedHenry()再写到 obj.oldY时,呈现的智能感知菜单上就剩余一个办法了。“哈,真的呢,基类的办法看不到了。可是,这和重写的效果岂 不是一样了吗?”我不由地又想起一个疑问,若是是一样的效果,要 Shadows干啥呀。“仍是有差异的。”大李开端扳着指头数 起来,“最显着的差异在于,躲藏适用于任何元素类型,你能够在派生类中 用Public Shadows oldY as Integer来躲藏基类的oldY()办法;而重写只能适用 于办法与特点,并且声明参数与润饰符都需求完全共同。”“ 还要注意一点,当派生类又派生出一个子类时,重写与躲藏都会被承继下去。当 然,若是在派生类中是用private来润饰Shadows成员的话,它的子类就会承继它 基类的成员了。”“我却是感受,如今VB.NET对承继的处置功 能真的很健壮,有承继,关于编程者来说,真的是件功德。”我不由感叹道 。“不错,承继层次系统是有许多优点,可是事物总是有其双面性 ,承继也有不少疑问,其间最费事的,即是软弱的基类。” 大李紧闭眉头仔细地说。“哦,啥叫软弱的基类 ?”我不解地问。VB.NET之旅(七)软弱的基类“已然说是软弱,当然是指它象蛋壳一样一触即溃喽。这个疑问其实很 好知道。程序总是由人来描绘与编写的,所以作业开端时思考不到某些疑问当然 也是很正常的事。所以能够在作业进行了一段时间后发现基类需求改变。你想, 若是我在基类中更改了成员的数据类型,以及那些答应重写的那些办法和特点, 那派生类及其子类还能正常作业吗?尤其是当一个团队中的多个开发人员一起来 创造基类和派生类时,就更是要命了。许多状况下,咱们能够现已把基类和一些 派生类编译成二进制办法进行提交了。更改基类,从头编译再散布,会牵一发而 动全身,致使项目的溃散。所以咱们把这叫做软弱的基类。也就 是说,它是整个工程中最单薄最丧命的环节。”大李眉头一向紧闭着,想必 是回想起了自个受冲击的阅历。“这么严峻呀,如今的软件工程设 计办法会不会对这个有极好的处理方案?”我尽力想减轻一下大李的严厉神 情。“若是对项目的前期描绘思考尽能够周详,在工程施行中对项目的代码 操控与有关性剖析做得结壮,会起到极好的效果。可是不论一个人怎么尽力,有 时仍是无法防止对基类进行不行预见的更改。咱们探索过好久,有了一些处置的 手法。”“真是成事在人呀,咱们如今有啥处理之道? ”我也一会儿振奋起来了。“呵呵,并不是啥完满处理方案 。只能在某种程度上减轻损害。咱们常用的一个办法,最直接的思维即是,把有 能够发作的更改全都放在派生类中进行,不在基类中做。”“ 这详细是啥意思呀,我仍是不太知道。”我不好意思地挠犯难。大李浅笑着点答应,看来是晓得我不会知道的了。“咱们在基类中运用的是 抽象类,它内含的办法与特点只要界说,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论