下载

1下载券

加入VIP
  • 专属下载券
  • 上传内容扩展
  • 资料优先审核
  • 免费资料无限下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 VB编程语言入门学习

VB编程语言入门学习.doc

VB编程语言入门学习

Bert平
2017-09-26 0人阅读 举报 0 0 0 暂无简介

简介:本文档为《VB编程语言入门学习doc》,可适用于高等教育领域

VB编程语言入门学习来自wwwvdiskcndxcyyswgVBNET之旅(一)失踪的窗体好久没有新作架不住兄弟们的问询与诘问只得拿些旧作来补上近来没空写作的缺乏。羞愧ing!这一系列与Henry手记系列不一样是一个人物办法的情形故事开端发表于《计算机国际》适用于VBnet初专家老鸟们就不必在我这一系列的文章上浪费时间了。我期望自个有时间今后能不断持续这一系列的文章参加许多的工程处理方案。一起我的Henry手记也会持续写下去以报答长时间以来撑持我的一切兄弟。布景:我叫Henry刚从大学计算机专业结业新参加索易公司的NET开发小组担任带我的喽罗是大李NET高手是个诙谐又有耐性的家伙老白是咱们有些的头头常常带给咱们乖僻又难缠的需求。榜首天上班白司理就带着我去NET技能小组签到。“大李这是新来的同事你要多帮帮他。”老白指着我对一个眼镜后边透着闪闪目光的年轻人说。“没疑问他会做得极好的。”大李莫非会看相不成,仍是人家谦让呀,不论了我只需自个尽力就对了。分钟后我现已在分配给我的一台P电脑WindowsXP平台下翻开了VisualStudioNET的集成编译环境(IDE)开端赏识了。一个多美丽的编译环境呀能够自选运用时的个性是VB的还是VC的。我挑选的是RAD功用好的VB个性。“你刚开端触摸NET在系统训练之前先加深点形象看看VBNET与VB有啥不一样吧。你创立两个窗体每个窗体上各有一个按钮点击时躲藏其地址的那个窗体切换出另一个窗体来。”大李的声响在耳边响起打断了我对IDE的赏识。但他提的需求也太简略了吧在VB中只需求两句写在按钮的单击呼应中的句子就行了:两个窗体:Form与Form。Form上的按钮为:CommandForm上的按钮为:CommandPrivateSubCommandClick()MeHideFormShowEndSubPrivateSubCommandClick()MeHideFormShowEndSub所以我毫不犹豫地在VSNET中内开端我的榜首个VBNET的项目了。首要新建了一个VBNET的Windows应用程序项目主动生成了一个WindowsForm:Form在其上参加一个按钮控件:Button然后增加了一个WindowsForm:Form在其上参加了一个按钮控件:Button。在描绘窗口双击Button后编译器会切换到代码窗口的Button的单击呼应代码中。在代码段中故计重施当我想写FormShow时在Form之后打个点呈现的智能感知菜单中却没有来自wwwvdiskcndxcyyswgShow这一办法。真新鲜这怎样能够,莫非VBNET改动有这么大。我昂首看了看站在我身旁的大李。大李马上面露浅笑看来是正中他的骗局。他手指向屏幕点了点Form中的代码的最初处:PublicClassFormInheritsSystemWindowsFormsForm不笨的我马上就知道了如今的Form是一个从SystemWindowsFormsForm承继下来的类了调用的时分当然需求先实例化了哈也不难嘛。马上动手:PrivateSubButtonClick(ByValsenderAsSystemObject,ByValeAsSystemEventArgs)HandlesButtonClickMeHide()DimfrmAsNewForm()„实例化Form类得到一个目标frmShow()EndSub在Form的Button的单击工作中也相似地写了一段代码运转一下和VB的效果差不多了。正在得意中大李走过来在我的Form中增加了一个文本框textbox清空其间的文字。然后运转了一下程序。在运转中他在文本框里写了几个字:“Henry的著作”然后点击Button切换到Form接着点击Button从头呈现的Form的文本框中却变成了空白。“这……”我一时语塞慢慢地想起点啥“大概是程序经过New布局办法每次点击按钮都会从头实例化一次Form类吧,所以每次从头呈现的窗体都不是从前从前呈现过的那个。那从前的窗体也就失踪了调不出来了。”“失踪,”大李不由笑了起来“对呀失踪在内存中。你每实例化一次系统就会拓荒一块内存给一个目标并会有相应的线程对其进行操控与办理。若是作为进程中主线程的榜首个Form被Hide起来没有封闭它那么即便你封闭后来新创立的一切窗体进程也不会被间断。那么用啥办法去找回你失踪的窗体或许说怎么就只运用一个目标不再每次实例化呢,”“大局目标~”我脱口而出感受到大李模棱两可只好硬着头皮持续说:“运用大局变量使Form与Form只实例化一次这样就能够了。”然后在大李的注视下我开端施行我的方案:再创立一个模块文件:modulevb并且同时在:处理方案办理器〉项目名sln〉右点鼠标〉特点〉通用属性>惯例>发动目标〉改为Module。让程序发动后先运转Module中的代码指令然后编写代码如下:'ModulevbModuleModulePublicfrmAsNewForm()„界说Form的共用变量实来自wwwvdiskcndxcyyswg例PublicfrmAsNewForm()„界说Form的共用变量实例SubMain()ApplicationRun(frm)„这句话标明程序发动了modele后会接下来运转frm,即form的一个实例。主线程就变成运转期的frm了。EndSubEndModule这样一来frm、frm就变成大局变量了在Button与Button的单击呼应代码中只需写:frmshow就能够了。再运转程序可以了“Henry的著作”一向都会保持在Form中的文本框里。大李老哥没等我欢笑起来就再次出手在frm躲藏起来的时分封闭了Form窗口(frm实例)桌面上啥窗体都没有了进程又一次被堕入在无法间断的状况下。MyGod面向目标的VBNET爱你莫非真的这么难……VBNET之旅(二)布局与析构在Form窗体的实例被躲藏的时分封闭了Form窗体的实例使我失去了对主线程的人工操控进程无法正常封闭了。只好运用CtrlAltDel调出系统进程办理器强行间断了该进程。为了防止昂首看见大李的笑脸我只好垂头想办法。有了我只需能截获Form实例封闭的音讯不就能够再调出躲藏的主线程窗体了吗,在Form的基类事办法进行处置:件(BaseClassEvent)中重载ClosingPrivateSubFormClosing(ByValsenderAsObject,ByValeAsSystemComponentModelCancelEventArgs)HandlesMyBaseClosingfrmShow()EndSub哈很便利我封闭了Form窗体的实例后被躲藏的那个frm又呈现了。“嗯”大李总算发话了“你再点击一下Form窗体上的Button试试。”我背心一凉隐约感受大李等待着的即是这个时分。无法的我还只能照他说的去做。公然弹出一个出错窗口“你封闭了frm这个Form的实例也就完毕了这个目标的生存期”大李看来是蓄势已久了“这即是犯错提示中所说的„无法拜访名为Form的已处置目标。当咱们封闭一个窗口的时分会宣布一个终止呼应并将该窗口目标就象上面界说的frm送入停止行列公共言语运行库的废物收回器盯梢着这个目标的生存期此刻就会调用此目标基类比方Form的Dispose办法用于毁掉目标并收回资源。所以……”“所以我只需判别一下frm是不是被毁掉就行了若是毁掉了我就再布局一个实例不就行了,”我恍然大悟道。来自wwwvdiskcndxcyyswg大李首次浅笑地址了答应说:“用frmIsDisposed就能够来判别了。”我心照不宣地写道:PrivateSubButtonClick(ByValsenderAsSystemObject,ByValeAsSystemEventArgs)HandlesButtonClickIffrmIsNothingOrfrmIsDisposedThen„判别目标是不是被毁掉frm=NewForm()EndIfMeHide()frmShow()EndSub这下完善多了两个窗体之间的切换也不会有这么多别扭的疑问了。我转过身看到大李现已找了把椅子坐在我的身边。“你来说说对VBNET的窗体实例的创立与毁掉的进程吧。”我整理了一下杂乱的思路长吁了一口气开端说:“一个窗体类比方Form类是经过调用其基类就是Form类的New办法来创立实例、Dispose办法来毁掉实例。”“没错。”大李边说话一边在我的程序中点击开来被代码窗口主动折叠起来的"Windows窗体描绘器生成的代码":PublicSubNew()MyBaseNew()'该调用是Windows窗体描绘器所必需的。InitializeComponent()'在InitializeComponent()调用之后增加任何初始化EndSub'窗体重写处置以整理组件列表。ProtectedOverloadsOverridesSubDispose(ByValdisposingAsBoolean)IfdisposingThenIfNot(componentsIsNothing)ThencomponentsDispose()EndIfEndIfMyBaseDispose(disposing)EndSub大李开端说明道:“MyBase关键词的行动相似于引证类的当时实例的基类的目标变量。MyBase常用于拜访在派生类中被重写或躲藏的基类成员。在这段代码中MyBase指的当然即是SystemWindowsFormsForm类了。布局目标时用的New办法是显式调用的没什么好说明的。但析构的办法值得一说。”他看了我一想持续说:“FormDispose办法是重写自ControlDispose办法的那么ControlDispose办法的含义又是怎么的,它的效果即是:开释由Control占用的非保管资源还能够另外再开释保管资来自wwwvdiskcndxcyyswg源。当它参数中的disposing为true则开释保管资源和非保管资源为false则仅开释非保管资源。Form类的disposing为true。在封闭窗体时主动调用dispose的功用是得益于net的公共语言运转库运行库主动处置目标规划和办理对目标的引证当不再运用目标时释放它们。其生存期以这种办法来办理的目标称为保管数据。主动内存办理消除了内存走漏以及其他一些常见的编程过错。任何类型的Dispose办法都大概开释它具有的一切资源。它还大概经过调用其父类型的Dispose办法开释其基类型具有的一切资源。该父类型的Dispose办法大概开释它具有的一切资源并一样也调用其父类型的Dispose办法从而在整个基类型层次布局中传达该办法。要保证始终正确地整理资源Dispose办法大概能够被屡次安全调用而不引发任何反常。”“可是若是系统疑问或应用程序调用上出了疑问不能正常调用Dispose怎样办,”我想起了啥问道。“若是经过Dispose还开释不洁净或没有调用Dispose系统的废物收回器会调用目标的Finalize办法进行铲除。由于履行Finalize办法会大大减损功用所以咱们不会一开端就用它去进行铲除作业。”大李略微说明了一下。我总算想起了一个重要的疑问:“若是总是在模块中界说的大局变量来处置由于拜访规模太大会不会有安全性的疑问,”“当然咱们能够试试其他的处理方案。”总是有备而言。VBNET之旅(三)同享成员一起对VBNET充满了猎奇与晓得的巴望。“除了大局变量外还有啥好办法吗,”我迫不急待地想知道成果。“能够运用同享成员。”大李依然是那么淡漠然“VBNET如今是撑持真实的面向目标编程能够承继、运用多态、同享成员和静态成员。同享成员即是在一切类和所界说派生类的实例之间同享的办法、属性、字段和工作。一切运用类创立的目标都能够拜访一样的数据、同享完结进程并且收到一样的激起工作。”“这么好呀那怎样完结呢,”我好象又回到了课堂上满脑都是无知的符号。“很简略在Public或Private成员润饰符后加上Shared关键词即可了。Shared关键词指示一个或多个被声明的编程元素将被同享。同享元素不关联于某类或布局的特定实例。能够经过运用类名或布局称号或许类或布局的特定实例的变量称号限制同享元从来拜访它们。你来看这段代码PublicClassShareClassPublicSharedSharedValueAsStringPublicSharedSubShareMethod()MsgBox("Thisisasharedmethod")EndSub来自wwwvdiskcndxcyyswgEndClassSubTestShared()DimSharedAsNewShareClass()'创立了类的一个实例DimSharedAsNewShareClass()'创立了类的第二个实例SharedSharedValue="ShareValue"'给同享字段赋值SharedSharedValue="ShareValue"'重写同享字段的值ShareClassShareMethod()'不必创立实例就能够调用类的办法EndSub“有两个关键一个是同享成员若是是办法或特点我们不必创立实例就能够直接用„类名共享成员的办法进行调用第二个关键同享字段是仅有的你来说说运转后SharedSharesValue的值是多少,”我脑筋里转了两圈已然说同享字段是仅有的那么SharedSharedValue和SharedSharedValue其实对应的是同一个同享字段所以么我马上大声说:“是ShareValue。由于被SharedSharedValue修改了。”“没错~”大李又一次绽放了会意的浅笑真是对我的最高奖励。“那你还不着手修正一下你的程序,”好~说做就做。已然同享特点在其调用的时分是不必实例化的那么我最佳能凭借布局一个同享特点来完结。并且要能够判别其实例是不是存在或是不是被毁掉若是不存在就布局一个新的窗体实例若是存在就对其进行调用:PrivateSharedmvbFormDefInstanceAsFormPublicSharedPropertyDefInstance()AsFormGetIfmvbFormDefInstanceIsNothingOrElsemvbFormDefInstanceIsDisposedThen„判别窗体实例是不是存在mvbFormDefInstance=NewForm()来自wwwvdiskcndxcyyswgEndIfDefInstance=mvbFormDefInstanceEndGetSet(ByValValueAsForm)mvbFormDefInstance=ValueEndSetEndProperty在Form中也参加相似的代码只不过把Form改为Form。调用它是如此的便利:Form中的代码PrivateSubButtonClick(ByValsenderAsSystemObject,ByValeAsSystemEventArgs)HandlesButtonClickMeHide()FormDefInstanceShow()EndSubForm中的代码PrivateSubButtonClick(ByValsenderAsSystemObject,ByValeAsSystemEventArgs)HandlesButtonClickMeHide()FormDefInstanceShow()EndSubPrivateSubFormClosing(ByValsenderAsObject,ByValeAsSystemComponentModelCancelEventArgs)HandlesMyBaseClosing来自wwwvdiskcndxcyyswgFormDefInstanceShow()EndSub赶忙运转一下不对呀榜首个窗体里文本框改为“Henry的著作”后再切换仍是不见了,我疑问地昂首看了看大李。“你再好好想想首次发动的是啥,”大李模糊地说了一句。“首次发动的是作为主线程的Form窗体呀~”我嘟啷着说。“那么FormDefInstance在哪呢,”大李这句话真是吵醒梦中人呀~我马上着手:ModuleModuleSubMain()ApplicationRun(FormDefInstance)EndSubEndModule并把Module设为发动项目。运转运转……哈哈一切都满意~我开端喜爱上VBNET了。VBNET之旅(四)类和布局刚上班就被大李找去了。“Henry昨日对窗体的操作给你最大的领会是啥,”“当然有领会最深的形象即是VBNET中类是无所不在了连窗体都变成了一个类。”我深有感受地说。“没错类是咱们用来布局VBNET应用程序时的最基本的编程布局了。你也学习过最基本的面向目标编程了那么你能告诉我布局与类有啥相似之处与不一样之处吗,”“好的。”我口中答复着心里仍是有点不以为然“布局和类都是对成员的封装办法可是类能够撑持承继……”大李一边点着头一边听我说听到我结尾支吾着没了声响才抬起头“还有呢,”“没了。”我这时才开端心中发慌。“呵呵一样之处我想你心中仍是知道的它们都富含成员包括布局函数、办法、特点、字段、常量、枚举和工作。都可以完结接口都有同享的布局函数。”“对不住结尾那一句都有布局函数是啥意思,布局的布局函数我从来没有自个界说过。”大李马上写下了这一段代码:StructureSHenryPublicx,yAsIntegerPublicSubNew(ByValxAsInteger,ByValyAsInteger)Mex=x来自wwwvdiskcndxcyyswgMey=yEndSubEndStructureSubmain()DimHAsSHenry=NewSHenry()DimHAsSHenry=NewSHenry(,)EndSub“真的呢能够完结布局的布局函数~”我还一向没有注意过这个疑问。“可是你只界说过一个带参数的布局函数H的实例化我是知道的可是H怎样也能经过编译器检测呢,”其实我心中更想问的是布局怎样也能实例化成目标那和类真的很象呀。“缘由么”大李推了推眼镜“每个布局都隐式地具有Public无参数实例构造函数该布局函数产生布局的默许值。所以你平常不写布局函数也一样能够New出一个布局来对吧,事实上咱们反而在布局类型声明中不行能声明无参数实例布局函数。只能声明„参数化实例布局函数。”“都能够用new来实例化布局和类在内存分配上莫非也是一样的吗,”这个疑问我一向挺不知道正巧借这个论题问一下。“在这上面不一样可就大了。”看到大李满面笑容的姿态我就晓得问到点子上了马上摆开姿势作仔细倾听状。“简略来说布局是值类型而类是引证类型。因而布局运用仓库分配类运用堆分配。”看到我苍茫的双眼大李笑了笑在电脑上飞快地写了个示例:ClassCHenryPubliczAsInteger=„能对非静态成员初始化也是一个差异EndClassSubmain()DimHAsSHenry=NewSHenry(,)'赋给Hx=DimHAsSHenry=HHx=来自wwwvdiskcndxcyyswgDimRAsNewCHenry()'Rz也是等于DimRAsCHenry=RRz=ConsoleWriteLine("Hx="Hx",Hx="Hx)ConsoleWriteLine("Rz="Rz",Rvalue="Rz)EndSub“你看一下成果大概是啥,”大李一边说一边运转了程序:Hx=,Hx=Rz=,Rvalue=“这即是值类型和引证类型的不一样。布局的实例Hx赋值并不影响Hx这是由于尽管它们同归于一种SHenry布局但它们都有各自的存储空间。相反给Rz赋值后则会影响R和R都引证的目标”“说得更知道一点类作为引证类型是存储在运转时的堆上只能经过引证该存储来拜访它们不能直接拜访。引证类型的变量总是包括该类型的值引证或包括空引证。空引证不引证任何内容除分配空引证外对空引证进行的任何操作都是无效的。引证类型的变量赋值只会创立引证的一个副本而不是所引证的值的副本。它们实践上都是会指向同一块存储区的。”大李手指了指运转的成果。“布局是直接存储在仓库上要么在数组中要么在另一个类型中。当包括布局实例的方位被毁掉时布局实例也会被毁掉。值类型总是能够直接拜访。咱们不能创立对值类型的引证也不能引证已毁掉的值类型实例。值类型的变量总是包括此类型的值。与引证类型不一样值类型的值不能为空引证也不能引证派生附近程度较大的类型的目标。值类型的变量赋值会创立所赋的值的副本当然会新拓荒一块内存区来保管值。”“哦我知道了。它们还有啥差异没有,”我对布局和类的差异首次有了深入的感受。“当然有许多比方一切的布局成员都默以为Public类变量和常量默以为Private其他的类成员默以为Public布局成员不能声明为Protected类成员能够布局进程不能处置工作类进程能够结构变量声明不能指定初始值、New关键词或数组初始巨细类变量声明能够。”大李喝了口水停了一下然后持续说。“布局从不停止所以公共言语运行库从不在任何布局上调用Finalize办法类可由废物收回器停止废物收回器会盯梢未完结的引证直到某个特定的实例当检测到没有剩余的活动引证时废物收回器将在类上调用Finalize。”“这个我能够知道由于布局是值类型是由系统统一办理内存不是引证所以不会对内存形成危害。”我接着说了两句。“还有你方才也说到了它们之间一个很重要的差异:布局是不行承继的而类能够承继。其实布局自身是从ValueType类隐式承继下来的。数据类型可分为值类型和引证类型。值类型要么是仓库分配的来自wwwvdiskcndxcyyswg要么是在布局中以内联办法分配的。引证类型是堆分配的。引证类型和值类型都是从结尾的基类Object派生出来的。当值类型需求充任目标时就在堆上分配一个包装该包装能使值类型看上去像引证目标一样并且将该值类型的值仿制给它。该包装被加上符号以便系统晓得它包括一个值类型。这个进程称为装箱其反向进程称为撤销装箱。装箱和撤销装箱能够使任何类型像目标一样进行处置。”“哦我知道为啥布局也能被实例化成目标了~”我心中喜不自禁。“类的承继我在用C和Java时也常常运用可是VB是不撑持承继的前次您说到VBNET能够撑持承继了它是怎样做到的呀~”VBNET之旅(五)类的承继“类的承继,”大李点答应“从前许多人批判VB的功用不完善时都会加上这个条件。可是如今VBNET中现已是比较完善的面向目标编程办法了。方才咱们也说到过类与VBNET的布局相似让咱们能够界说封装一组有关项的数据类型。然而与布局的一个重要差异即是VBNET类能够承继和扩展其他类的特性。作为新类的根底的类称为„基类。从基类派生的类称为„派生类。派生类承继基类中界说的一切字段、特点、办法和工作。你看咱们只需对类进行一次开发和调试就能够将其作为其他类的基础重复运用。”“类的承继的概念我学过的在VBNET中是如何来实践演练呢,”我仍是坚持着问。“我写段代码给你看一下吧俗语不是说百闻不如一见吗,”大李戏弄了两句噼噼啪啪地开端敲打起键盘来:PublicClassCBaseHenryPrivatexAsInteger=ProtectedyAsIntegerSubNew()ConsoleWriteLine("基类的布局")EndSubProtectedOverridesSubFinalize()ConsoleWriteLine("基类的析构")MyBaseFinalize()EndSubPublicOverridableFunctionGetY(ByValxAsInteger)AsIntegerMey=mexx„private类型的mex只能在基类中运用ConsoleWriteLine("基类的GetY办法成果为:"Mey)来自wwwvdiskcndxcyyswgReturnMeyEndFunctionPublicSubOldY()ConsoleWriteLine("基类的OldY办法")EndSubEndClass“你看这是一个基类我再给你写个承继自该类的派生类。”他一边说一边持续写:PublicClassCDerivedHenryInheritsCBaseHenrySubNew()MyBaseNew()„注意:这句话要放在sub内的榜首句ConsoleWriteLine("派生类的布局")EndSubProtectedOverridesSubFinalize()ConsoleWriteLine("派生类的析构")MyBaseFinalize()EndSubPublicOverridesFunctionGetY(ByValxAsInteger)AsIntegerMey=x*„protected类型的mey却能够在派生类中使用ConsoleWriteLine("派生类的GetY办法成果为:"Mey)ReturnMey来自wwwvdiskcndxcyyswgEndFunctionPublicSubNewY()ConsoleWriteLine("派生类的新办法")EndSubEndClass“你看清了吧咱们经过声明Inherits关键词来标识该类的基类是谁若是没有标识的类比方CBaseHenryVBNet就会视其为派生自Object基类这是种隐式承继和布局是隐式承继自ValueType类的办法是一样的。”大李指着屏幕跟我说明着。overload标识是啥意思呀,”我隐约感受到它们的含义却无法知道地说出来。“那这些overrides与“咱们运用承继也要答应派生类中的某些特点或办法有与基类不一样的行动咱们想„重写它但基类也得要附和你才干重写呀不然不就会发作命名抵触了吗,由于派生类的目标是能够运用基类的共用成员的那怎样晓得哪些基类的办法与特点是被派生类重写了呢,所以就有必要有一个约好:咱们在基类顶用Overridable润饰符来标识答应基类中的特点或办法在其派生类中被重写没有标识的其实即是默以为有NotOverridable润饰符来隐式地标识用于提示编译器该特点或办法不行被重写然后在派生类重写时咱们就用Overrides润饰符来标识哪些是重写自基类中界说的Overridable特点或办法。”大李娓娓道来“咱们来演练一下对派生类的操作吧。”PublicSubMain()DimobjAsCDerivedHenry=NewCDerivedHenry()objGetY()'调用派生类的GetY办法objOldY()'调用基类的oldY办法objNewY()'调用派生类的NewY办法EndSub然后大李按了一下F键在“输出”窗口中就呈现了如下的运转成果:基类的布局„开始运转NewCDerivedHenry()派生类的布局派生类的GetY办法成果为:„objGetY()的运转成果=*不等于基类的()基类的OldY办法„objOldY()的运转成果派生类的新办法„objNewY()的运转成果派生类的析构来自wwwvdiskcndxcyyswg基类的析构“你看你只在Main中实例化了一个派生类的对象为啥先会呈现„基类的布局,”大李问。“这个么”我开端在代码中检查起来“是这句了。”我手指着派生类里的这段代码:SubNew()MyBaseNew()„注意:这句话要放在sub内的榜首句ConsoleWriteLine("派生类的布局")EndSub“没错咱们有必要要注意这一点即是派生类的布局函数与析构函数都有必要从头编写。New布局函数通常用于翻开文件、衔接到数据库、初始化变量以及处置任何需求在可运用目标前完结的其他使命。咱们有必要在SubNew布局函数中的榜首行代码运用句子MyBaseNew()来调用类层次布局中该类的基类的布局函数以取得基类的性质。析构则是在SubFinalize中履行完对派生类的的整理使命如保管状况信息、封闭文件和与数据库的衔接以及履行在开释目标前有必要完结的其他使命之后在析构函数的结尾一句运用句子MyBaseFinalize()显式调用其基类的SubFinalize办法以析构MyBaseNew()布局的内容。所以你从程序运转成果中也能够很知道的看出这一次序。”大李敲击着屏幕象是给我提个醒。“知道了我会记取的。”我诚实地址头回应着。大李俄然想起了啥昂首对我说:“讲到类的承继咱们还得看一下重载与躲藏的疑问。”VBNET之旅(六)重载与躲藏大李坐在转椅上左右晃动着手中的一个硬币在他指间灵活地翻滚着。“hi,Henry。你对重写与重载的意思知道是怎么的呢,”我正盯着他手中的硬币发呆呢“哦重写即是您方才举的示例中在派生类顶用Overrides从头编写有Overridable标识的基类的办法或特点重载么即是咱们能够用一样的称号在一个类顶用不一样的参数列表来创立多个办法和属性在调用时就能够习惯不一样参数类型的需求。”“在一个类中创立,”大李的左眉向上一挑我就晓得我能够说错了。可是好象没有说错啥呀。“那好你看一下这样的写法会有啥成果,”PublicClassCBaseHenryPublicSuboldY()ConsoleWriteLine("基类的oldY办法")EndSubEndClassPublicClassCDerivedHenryInheritsCBaseHenryPublicOverloadsSuboldY(ByValjAsInteger)来自wwwvdiskcndxcyyswgConsoleWriteLine("派生类的oldY办法")EndSubEndClassPublicSubMain()DimobjAsCDerivedHenry=NewCDerivedHenry()然后大李写了objoldY这时呈现的智能感知菜单上呈现了参数列表:“咦第二个oldY()无参数进程签名大概是基类界说的呀。为什么在派生类的实例中也会呈现呀~”我不由猎奇起来。“没错。还记得我前次曾显式编写布局函数的事吗,我用了一个mybasenew()用于承继下基类的性质。如今没有写其实是一种默许的隐式调用。”大李一说我就知道了其实如今的派生类大概是内含两个oldY办法了无参数的oldY()其实就是基类的办法是由于Overloads和Mybasenew()两层效果的影响。“那你再看这样的改变状况。”大李象是看出我现已知道了这个疑问。他在派生类中增加了一个用Overloads标识的与基类办法共同的无参数oldY()。PublicClassCBaseHenryPublicSuboldY()ConsoleWriteLine("基类的oldY办法")EndSubEndClassPublicClassCDerivedHenryInheritsCBaseHenryPublicOverloadsSuboldY(ByValjAsInteger)ConsoleWriteLine("派生类的oldY办法")EndSubPublicSuboldY()ConsoleWriteLine("派生类的oldY办法")来自wwwvdiskcndxcyyswgEndSubEndClassPublicSubMain()DimobjAsCDerivedHenry=NewCDerivedHenry()objoldY()EndSub“好的如今你再说说看如今的objoldY()的运转成果会打印出啥,”大李手按在F运转键上问我。“大概是派生类的不对基类呃派生类……”我一会儿就晕了。“呵呵。”大李也不由发笑起来。然后点击了一下F键。成果是:派生类的oldY办法“这就叫躲藏咱们用overloads办法躲藏了基类的同名办法。以防用户发作混杂。通常来说躲藏有两种状况一种是经过规模来完结。比方你界说一个大局变量x但在一个办法中你又界说了一个局部变量x在办法中运用x时运用的是局部变量的那一个也即是用局部变量x在办法中躲藏了大局变量x。另一种状况即是经过承继来隐藏办法么除了方才用的overloads还能够用Shadows关键词来完结。”“Shadows,暗影,却是很恰当的姓名。这个是怎样用的呢,”我爱好由然而生。“Shadows功用很强的。”说着大李又开端修正方才的代码了。PublicClassCBaseHenryPublicSuboldY()ConsoleWriteLine("基类的oldY办法")EndSubEndClassPublicClassCDerivedHenryInheritsCBaseHenryPublicShadowsSuboldY(ByValjAsInteger)ConsoleWriteLine("派生类的oldY办法")EndSubEndClass来自wwwvdiskcndxcyyswgPublicSubMain()DimobjAsCDerivedHenry=NewCDerivedHenry()再写到objoldY时呈现的智能感知菜单上就剩余一个办法了。“哈真的呢基类的办法看不到了。可是这和重写的效果岂不是一样了吗,”我不由地又想起一个疑问若是是一样的效果要Shadows干啥呀。“仍是有差异的。”大李开端扳着指头数起来“最显着的差异在于躲藏适用于任何元素类型你能够在派生类中用PublicShadowsoldYasInteger来躲藏基类的oldY()办法而重写只能适用于办法与特点并且声明参数与润饰符都需求完全共同。”“还要注意一点当派生类又派生出一个子类时重写与躲藏都会被承继下去。当然若是在派生类中是用private来润饰Shadows成员的话它的子类就会承继它基类的成员了。”“我却是感受如今VBNET对承继的处置功能真的很健壮有承继关于编程者来说真的是件功德。”我不由感叹道。“不错承继层次系统是有许多优点可是事物总是有其双面性承继也有不少疑问其间最费事的即”大李紧闭眉头仔细地说。是„软弱的基类。“哦啥叫„软弱的基类,”我不解地问。VBNET之旅(七)软弱的基类“已然说是软弱当然是指它象蛋壳一样一触即溃喽。这个疑问其实很好知道。程序总是由人来描绘与编写的所以作业开端时思考不到某些疑问当然也是很正常的事。所以能够在作业进行了一段时间后发现基类需求改变。你想若是我在基类中更改了成员的数据类型以及那些答应重写的那些办法和特点那派生类及其子类还能正常作业吗,尤其是当一个团队中的多个开发人员一起来创造基类和派生类时就更是要命了。许多状况下咱们能够现已把基类和一些派生类编译成二进制办法进行提交了。更改基类从头编译再散布会牵一发而动全身致使项目的溃散。所以咱们把这叫做„软弱的基类。也就是说它是整个工程中最单薄最丧命的环节。”大李眉头一向紧闭着想必是回想起了自个受冲击的阅历。“这么严峻呀如今的软件工程设计办法会不会对这个有极好的处理方案,”我尽力想减轻一下大李的严厉神情。“若是对项目的前期描绘思考尽能够周详在工程施行中对项目的代码操控与有关性剖析做得结壮会起到极好的效果。可是不论一个人怎么尽力有时仍是无法防止对基类进行不行预见的更改。咱们探索过好久有了一些处置的手法。”“真是成事在人呀咱们如今有啥处理之道,”我也一会儿振奋起来了。“呵呵并不是啥完满处理方案。只能在某种程度上减轻损害。咱们常用的一个办法最直接的思维即是把有能够发作的更改全都放在派生类中进行不在基类中做。”“这详细是啥意思呀我仍是不太知道。”我不好意思地挠犯难。大李浅笑着点答应看来是晓得我不会知道的了。“咱们在基类中运用的是抽象类它内含的办法与特点只要界说没有进行完结而把完结有些都放在派生类中做。这样一来抽象类本身是无法被实例化的。可是它的优点显而易见即是有能够发作的完结上的更改都会只涉及到它的派生类了。VBNET中就供给了这样的手法。”说着大李就翻开VSNET集成编译环境随手写了一小段代码:PublicMustInheritClassCBaseHenry来自wwwvdiskcndxcyyswgPublicMustOverrideSubsubX(ByValxAsInteger)PublicMustOverrideFunctionfcnY(ByValyAsInteger)AsLongEndClassPublicClassCDerivedHenryInheritsCBaseHenryPublicOverridesSubsubX(ByValxAsInteger)'写入完结的代码EndSubPublicOverridesFunctionfcnY(ByValyAsInteger)AsLong'写入完结的代码EndFunctionEndClass“这里要注意两个疑问一个是关键词咱们用MustInherit来润饰类名使类变成抽象类在它的成员中把办法和特点前参加MustOverride润饰符表明它们有必要在派生类中加以完结。第二个要注意的是派生类有必要对一切用MustOverride标识的基类办法和特点都进行完结只重写了subX不写fcnY编译器会报错的。”“这确实能够处理一有些疑问但好象只能处理在基类中进行完结的代码有更改的疑问关于数据类型的更改好象没有啥效果。”我看了好一会宣布了这样的疑问。“所以我方才说是在某种程度上进行处理嘛。”大李也不由笑了起来“不过你提的这个疑问倒不是太费事咱们能够在派生类顶用Shadows来处理呀~(这却是个不错的主见我心中暗暗评估了一番。俄然我又想到一个疑问:“若是基类要做功用拓展怎样办呀,”“若是是要做拓展最安全的方法是增加新成员而不是对基类的大举修正。通常是往派生类增加描绘时缺失的新成员。最佳不要运用Overloads关键词来命名与基类一样的成员那样往往会带给你意想不到的疑问。最佳从头界说新成员命名上也要尽量与基类已有的成员名区别开来。其实也能够往抽象类基类中增加新成员的界说但这样一来需要为基类拟定版别尽管不会对应用程序形成毁灭性的损害可是大概要能够完全地操控与办理自个的代码。咱们通常是不期望拓展基类的。”我现已粗心上领会了大李的一片苦心:“您的意思是不是指基类的软弱疑问实践上是客观存在的咱们所做的即是要最大程度的减小这个疑问带来的损害,”大李眼里闪过一丝赞赏的笑意颌首道:“没错关于一个应用程序的描绘者来讲想运用面向目标办法来开发有必要要在描绘的时分精心策划类的层次布局。通常来说是有这样几个准则需求掌握的:来自wwwvdiskcndxcyyswg榜首遵循先通用再专用的准则。先描绘好层次布局中每一级另外类中的通用有些也即是供给给派生类承继的成员和标识为Public的成员第二在界说数据类型和存储区时要有预留量以防止今后更改艰难。例如即便当时数据能够仅需求Integer类型就够了在描绘时咱们运用Long类型的变量。当然最佳能物尽其用也不要盲目扩大第三在一个项目中有必要统一办理与分配团队中运用的一切的命名以削减命名抵触这一点其实事关重大第四要运用供给可行的最低拜访权限的拜访润饰符声明类成员。内部类成员应声明为Private仅在类内与派生类才需求的成员应符号为ProtectedFriend数据成员能够从类的外部拜访但仅限于该模块是界说该类的项目的一个组成有些运用Public标识的成员只能是实例化时真实需求的内容并且常常用在类层次布局的底部。”“也即是说一个标准的操作标准的命名系统可以决议基类的健壮与否,”我不由感受了一声。“不对大概这样说能够决议的是给软弱的基类穿上多厚的防护衣。由于基类一向都是软弱的。”大李更正路。我连声附和:“对对。我如今是真实明白为啥总有人提编程标准的工作我一向以为是增强代码的可读性没想到对程序本身还有这么大的协助。”“当然其实你仔细想一下Overrides关键词的效果不论要不要注明编译器都能够很便利地判别办法或特点是不是在基类中签名是不是匹配可是VBNET需求咱们有必要标示即是强迫开发人员注明重载基类办法或特点的目的使开发进程更合理与有用。此外还有更重要的即是咱们要在工程实践中不断地学习与锻炼晓得更多的常识取得更多的经历这样才会生长为一名合格的程序描绘师。就拿承继来说吧在NET中其实撑持三种承继办法:完结承继、接口承继、可视承继。咱们其实只用了第一种承继办法你看要学的东西是不是许多,”

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

评分:

/28

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利