6. Ãþ§O»Pª«¥ó

¦Û±q·L³nVisual Basic 4¤Þ¤JÃþ§O¼Ò²Õªº·§©À«á¡AVisual Basicªºµo®i«K¶É¦V©óª«¥ó¾É¦V»y¨¥¤¤¡CVisual Basic¯uªº¬Oª«¥ó¾É¦V(OOP)»y¨¥¶Ü¡H©Î¥u¬O¥Hª«¥ó¬°°ò¦ªº»y¨¥¡H©ÎªÌ¬Y¨Ç¦a¤è¤¶©ó¨âªÌ¤§¶¡¡H

´Nµ§ªÌ­Ó¤H¹ï³o°ÝÃDªº·Qªk¡GVisual Basic¨Ã¤£¬O¯u¥¿ªºOOP»y¨¥¡A¦]¬°VB¨Ã¤£¨ã³Æ¬Y¨Çoop»y¨¥ªº¯S©Ê¡A¨Ò¦pÄ~©Ó¡C¤£¹L³o¤£¥Nªíµ{¦¡³]­p¤H­û¤£»Ý­nª«¥ó»PÃþ§Oªº¨Ï¥Î²Ó¸`¡C¥H¤U¬O¥»³¹©Ò­n¶Ç¹F¤Î¦¹®Ñ©Ò­nÄÄ­z´£¥Üªº¦a¤è¡G

­Y±z¹ïOOP§¹¥þ­¯¥Í¡A¥»³¹¸`(À³¸Ó¤]¬O¥»®Ñ¤¤³Ì§xÃøªº³¹¸`)¥i¥HÀ°§U±z²z¸Ñ¡C¥H¸û¤Öªº½g´TÁA¸Ñ¦p¦ó¥Hª«¥óÀ°¦£¼g¥X§ó¦nªºµ{¦¡¡A¦P®É±z¥²¶··Ç³Æ§ïÅܱzªºÆ[©À¡A¤£­n¹³³\¦hµ{¦¡³]­pªÌ±q¦­´ÁªºMS-DOS»y¨¥¦pQuickBasicÂà¨ì¥H¨Æ¥ó¬°¾É¦Vªº³]­pÀô¹Ò¡A¦pVisual Basic®É©Òªá¶Oªº¤@¼Ë¡C¦ý¬O¤@¥¹ÁA¸ÑOOPªº°ò¥»·§©À«á¡A±z¤j·§·|¦P·N±qVisual Basicªº²Ä¤@ª©¨ì²{¦b¡Aª«¥ó¬O¤@¥ó³ÌÅý¤H·P¨ì¿³¾Äªº¨Æ¡C¶i¤JOOP»â°ì«á¡A±N·|µo²{¦Û¤v¯à«Ü§Ö¦a³W¹º¡B³]­p¥X¹ï©ó°ÝÃDªº·sªº¡B²¼äªº¸Ñ¨M¤èªk¡A³q±`ªá¶O®É¶¡¤Ö¥Bµ{¦¡½X¤]µu¡C°µ¬°¤@­ÓVisual Basicµ{¦¡³]­pªÌ¡A¹ï©ó³\¦h¦³Ãö¨Æ¥ó¡B¸ê®Æ®w³]­p¤Î¨Ï¥ÎªÌ¤¶­±ªºÄ³ÃDªººë¶iµ{¦¡¼¶¼g§Þ³N¤w¸gºë³q¡COOP´N¨Ã¤£§xÃø¤F¡A¥L¥u¬O¤£¦P½}¤F¦ý«o·¥«×¦³½ì¡C

­Y´¿¸g¾\Ū¦³ÃöOOPªº®ÑÄy©Î¤å³¹¡AµLºÃ¦a·|µo²{³\¦h¹ï©óª«¥óªº¤£¦P©w¸q¡C¤j¦h¼Æªº©w¸q³£¬O¹ïªº¡A¦]¦¹±z·|·P¨ì§x´b¡Cµ§ªÌ¶É¦V©ó¥H¤Uªº©w¸q¡G

 ª«¥ó¬O­Óµ²¦X¸ê®Æ©M³B²z¸ê®Æªºµ{¦¡½Xªº¤@­Ó¹êÅé¡C 

Åý§Ú­Ì¬Ý¬Ý¹ê»Úªº¨Ò¤l¡C

°ò¥»·§©À
¡@

³\¦hµ{¦¡³]­p®v²Ä¤@¦¸±µÄ²OOP®É¡A¹ï©óÃþ§O©Mª«¥ó·|·P¨ì§x´b¡C¦]¦¹¡A¦b¦¹§@²µuªº¸ÑÄÀ¡CÃþ§O¡]Class¡^¬Oµ{¦¡¡]Visual Basicªº­ì©lµ{¦¡½X¡^ªº¤@³¡¥÷¡A©w¸q¤FÄÝ©Ê¡B¤èªk©M¨Æ¥ó—²¨¥¤§¡A¦b°õ¦æ´Á¶¡·|¦³¤@­Ó©Î¦h­Óª«¥ó³Q«Ø¥ßªº¦æ¬°¡Cª«¥ó¡]Object¡^¬O¦b°õ¦æ®É³Q«Ø¥ßªº¹êÅé¡A»Ý­n°O¾ÐÅéÁÙ¦³¨ä¥L¥i¯àªº¨t²Î¸ê·½¡A·í¤£¦A»Ý­n©Î·íÀ³¥Îµ{¦¡µ²§ô®É¡A±N³QÄÀ©ñ¡C´N¬YºØ·N¸q¨Ó»¡¡AÃþ§O¬O³]­p¶¥¬qªº¹êÅé¡A¦Óª«¥ó¬O°õ¦æ¶¥¬qªº¹êÅé¡C

¨Ï¥ÎªÌ±q¨Ó¤£·|¬Ý¨ìÃþ§O¡FµM¦Ó¡C¤]³\¦b¿Ã¹õ¤W·|¬Ý¨ì¥B±µÄ²¨ì±qÃþ§O©Ò²£¥Íªºª«¥ó¡AÄ´¦pµo²¼¡B«È¤á¸ê®Æ©Î¶ê°é¡C¨­¬°¤@­Óµ{¦¡³]­pªÌ¡AÆ[©À¥²¶·¤Ï¹L¨Ó¡A¦]¬°·í¼¶¼gÀ³¥Îµ{¦¡®É¡A¤j³¡¤À¦b±z­±«eªº¦³§Îªº¨Æ±¡³£¬OÃþ§O¡A¨ä¦bVisual BasicÀô¹Ò¤¤¥HÃþ§O¼Ò²Õªº§Î¦¡¦s¦bµÛ¡Cª½¨ì°õ¦æÀ³¥Îµ{¦¡®É¡A¦bµ{¦¡½X¤¤ª«¥ó¤ñ¥H Dim ±Ô­z«Å§iªºÅܼÆÁÙ¤£¹ê»Ú¡C¥H§Úªº¬Ýªk¡A³o¤G¤Àªk³y¦¨³\¦hVisual Basic³]­pªÌ¹ïOOPªº¿ù»~»{ÃÑ¡C§Ú­Ì¤w¸g³Q³Ì·RªºRAD¤u¨ã©ÒÃdÃa¡A¥B³q±`»{¬°ª«¥ó¬O¥iµøªºª«¥ó¡A¨Ò¦pªí³æ¡B±±¨î¶µµ¥µ¥¡C¦ÓVisual Basic¤]¥i¥H³Ð³y¦¹Ãþ¥iµøªºª«¥ó-¥]¬A·L³nActiveX±±¨î¶µ-ª½¨ì±zÁA¸Ñ¤F¦bµ{¦¡½X¤¤´X¥G±q¦³§Îªº¥B¥iµøªº¹êÅ餤¦pµo²¼¡B²£«~¡BÅU«È¤Î­û¤uµ¥µ¥¡A¨ì³\¦h©â¶Hªº¦p½T»{µ{§Ç©Î¨â­Ó¸ê®Æªí¤§¶¡ªºÃö³s¡A©Ò¦³ªº¨Æ±¡³£¬O¤@­Óª«¥ó¡A¤~ª¾¹Dª«¥ó¾É¦Vªº«Â¤O¡C

OOP¥D­nªºÀu¶Õ
¡@

Æ[¬Ý¹ê¨Ò¤§«e¡A¥ý´£¥Ü±zOOP¥²¶·´£¨ÑªºªF¦è¡C©³¤U±N·|¦C¥XOOPL(object-oriented programming languages)ªºÃöÁä¯S©Ê¨Ã¸ÑÄÀ¤@¨ÇÆ[©À¡C³o¨ÇÆ[©ÀªºÁA¸Ñ¹ï¥»³¹¸`µy«á¤¶²Ðªº³¡¤À¦³¤@©wªºÀ°§U¡C

«Ê¸Ë
¡@

¦bOOP¤¤¡A«Ê¸Ë©Î³\¬Oµ{¦¡³]­p®v³ÌªY½àªº¯S©Ê¡C·§²¤¦a»¡¡Aª«¥ó¬O¸ê®Æ¥»¨­ªº°ß¤@¾Ö¦³ªÌ¡C©Ò¦³ªº¸ê®Æ¬ÒÀx¦s¦bÀ³¥Îµ{¦¡¤¤ªº¬Y³¡¥÷¡A¥BµLªkª½±µ¦s¨úªº°O¾ÐÅ餤¡A¨Ã¥B©Ò¦³¤u§@¤Î¨ú±o°Ê§@»Ý³z¹Lª«¥ó¥»¨­ªº¤èªk¤ÎÄݩʨӹB§@¡C¦¹¤@²³æªº·§©À¦Ü¤Ö¦³¥H¤U¨âºØµ²ªG¡G

  • ¥i¥H¦bª«¥óÄݩʯu¥¿¦s¨ì°O¾ÐÅé«eÀˬd¨ä©Ò¦³­È¡A¨Ã¥ß§Y©Úµ´µL®Äªº­È¡C
    ¡@
  • µL¶·¦Ò¼{µ{¦¡¦p¦ó»Pª«¥ó¹B§@¡A¥i¥H¦Û¥Ñ¦a§ïÅÜÀx¦s¦bª«¥ó¤¤ªº¤º³¡¸ê®Æ¡C³oªí¥Ü¡AµL¶·§ïÅÜÀ³¥Îµ{¦¡ªº¥ô¦ó¤@¦æµ{¦¡½X¡A«K¥i­×¥¿¡B§ïµ½Ãþ§O¤º³¡ªº¬yµ{¡C
    ¡@

»P¤j³¡¤ÀªºOOP¯S©Ê¬Û¦P¡A½T»{Ãþ§O¨ã¦³§¹¬üªº«Ê¸Ë¬O±zªº³d¥ô¡C¨Ï¥ÎÃþ§Oªº¨Æ¹êµLªk«OÃҫʸ˪º¥Ø¼Ð¯à°÷¦³®Ä¹F¨ì¡C¥»³¹¤Î¤U¤@³¹·|Á¿¨ì¤@¨Ç²³æªº³W«h¤Î±`ÃÑÀ°§U±z¦p¦ó§¹¦¨°·¥þªºÃþ§O¡C¤@­Ó§¹¬üªºÃþ§O¬O­Ó¥i¥H¦Û°Ê¨¾½d¤º³¡¸ê®Æ³Q«§ïªºÃþ§O¡C­Y¦³¤@­Ó±q¾Ö¦³¦³®Ä¸ê®ÆªºÃþ§O©Ò²£¥Íªºª«¥ó¡A¥B¦bª«¥ó¤W©Ò¦³°õ¦æªº°Ê§@¥u¬O§â¸ê®ÆÂà´«¶i¨ä¥L¦³®Äªº¸ê®Æ¤¤¡]©Î·í°Ê§@µL®Ä®É´£¥X¿ù»~¡^¡A¨º«K¥i¥Hµ´¹ï½T©w¦¹ª«¥ó¬O¦b¦³®Äªºª¬ºA¡A¥B±q¥¼¼W²K¿ù»~­Èµ¹µ{¦¡¡C³o¬O¤@­Ó¨Ò¤l¡A¦ý¤]¬O­Ó­«­nªº·§©À¡AÅý±z¹ïµ{¦¡ªº°»¿ù¹Lµ{¦³¬Û·í·§©À¡C

¨C­Ó³]­pªÌÀ³¸Ó¹F¨ìªº²Ä¤G¥Ø¼Ð¬Oµ{¦¡¦A§Q¥Î¡AÂǥѫإߩöºûÅ@¥B¥i¦A§Q¥ÎªºÃþ§O¡A¥i¥H¹F¨ì¦b¨ä¥LÀ³¥Îµ{¦¡¤¤­«½Æ¨Ï¥Î¡C¥i¥H´î¤Ö¶}µo®É¶¡©Mªá¶O¬OÃöÁä¦]¯À¡C¦b¦¹·§©À¤UÃþ§Oªº¥\¥Î§ó¦h¡A¦ý¬O¬Û¹ï¦a¤´»Ý­n±zªº°t¦X¡C·í¶}©l¼¶¼g¤@­Ó·sÃþ§O®É¡AÀ³¸Ó­n§i¶D¦Û¤v¡G¦b¨ä¥LªºÀ³¥Îµ{¦¡¤W¬O§_¥i¥H­«½Æ¨Ï¥Î¡C±q¤@­Ó¯S©wªº³nÅ餤¥ß§Y¶}µo¤@­ÓÃþ§O­nªá¶O¦h¤[¡H¤j³¡¤Àªº±¡ªp¤U¡A³oªí¥Ü·s¼W¤Ö¼ÆÄݩʩΤּƤ޼Ƶ¹¤èªk¡A«K¥i¹F¨ì«D±`¦nªº®ÄªG¡C§O§Ñ¤FÁ`¬Oµ¹©wÄݩʪº¹w³]­È©M¤èªk¿ï¾Ü©Ê¤Þ¼Æ¡A¦]¦¹¤j³¡¤À±¡ªp¤U¡A³o¨Ç¼W±j¥\¯à¤£·|ÅýÃþ§Oªº¨Ï¥Î«K±o«Ü½ÆÂø¡A¦ý¤S¯à¹F¦¨©Ò»Ý¡C

¦Û§Ú«Ê¸Ëªº·§©À¤]¬O»Pµ{¦¡½X¦A§Q¥Î©M«Ê¸ËÄY±K¦a¬ÛÃö³s¡C­Y·Q«Ø¥ß¤@²³æ¥i¦A§Q¥ÎªºÃþ§O¼Ò²Õ¡Aµ´¹ï¤£¤¹³\Ãþ§O¨Ì¦s¦b¥ô¤@¥~¦bªº¹êÅé¡A¨Ò¦p¥þ°ìÅܼƤW¡C³o·|¯}Ãa«Ê¸Ë¡]¦]¬°¦bÀ³¥Îµ{¦¡ªº¨ä¥L¦a¤èªºµ{¦¡½X¤¹³\§ïÅÜÅܼƭȬ°¬Y¨ÇµL®Äªº¸ê®Æ¡^¡C¥B³Ì­«­n¦a¡A·|ÁקK¦A¨Ï¥Î¦b¥L³B¨S¦³½Æ»s¥þ°ìÅܼƪºÃþ§O¡C°ò©ó¦P¤@²z¥Ñ¡AÀ³¸Ó¹Á¸Õ»s³y¤@­Ó¿W¥ß©ó¨ä¥L¼Ò²Õªº¤@¯ë¥Î³~³W«hªºÃþ§O¡C¤@¯ë±¡ªp¤U¡A§Ú¸û³ßÅw¦b¨C¤@­ÓÃþ§O¼Ò²Õ¤¤½Æ»s²µuªº³W«h¡A¥i¥H¨Ï±oÃþ§O®e©ö²¾©¹¨ä¥L¦a¤è¡C

¦hºA©Ê
¡@

«D¥¿¦¡¦a¡A¦hºA©Ê¡]Polymorphism¡^¬O¤£¦PÃþ§O¹ï¥~Åã¥Ü¦b¬Û¦ü¡]©Î¬Û¦P¡^¤¶­±ªº¯à¤O¡C¦bVisual Basic¤¤³Ì­«­nªº¦hºA©ÊºØÃþ¬Oªí³æ©M±±¨î¶µ¡CTextBox ±±¨î¶µ©MPictureBox±±¨î¶µ¬O§¹¥þ¤£¦Pªºª«¥ó¡A¦ý¬O¥L­Ì¦³¤@¨Ç¦@¦³ªºÄÝ©Ê©M¤èªk¡A¨Ò¦p¡GLeft¡BBackColor ©M Move¡C³o¤@¬Û¦ü³B²¤Æµ{¦¡³]­pªÌªº¤u§@¡A¦]¬°¤£¥²°O¦í¤W¦Ê­Ó¤£¦P¦W¦r©M»yªkªº®æ¦¡¡C§ó­«­nªº¡A¥¦Åý±z¨Ï¥Î³æ¤@Åܼƺ޲z¤@¸s²Õªº±±¨î¶µ¡]¦p±±¨î¶µ¡BÅܼơBª«¥ó«¬ºA¡^¡A¥B¥i«Ø¥ß¹B¥Î©óªí³æ¤W©Ò¦³±±¨î¶µªº³qºÙµ{§Ç¡A¦]¦¹©úÅã´î¤Ö¦¹¤@ºØÃþªºµ{¦¡½X¡C

Ä~©Ó
¡@

Ä~©Ó¡]Inheritance¡^¬O³\¦hOOP»y¨¥´£¨Ñªº¤@ºØ¯à¤O¡A±q¤@­ÓÃþ§O¤¤¨ú±o¤@­Ó·sªºÃþ§O¡]derived©Îinherited Ãþ§O¡^¡CDerivedÃþ§O¦Û°ÊÄ~©Ó°ò¦Ãþ§OªºÄÝ©Ê©M¤èªk¡C¨Ò¦p¡A¥i¥H©w¸q¤@¯ëªº Shape Ãþ§O¬°¦³¦p Color ©M Position ªºÄÝ©Ê¡AµM«á¹ï³\¦hÄ~©Ó©Ò¦³Äݩʪº¯S§OÃþ§O¡]Ä´¦p Rectangle¡BCircle µ¥µ¥¡^¨Ï¥Î¦p¦P°ò¦Ãþ§O¯ë¡CµM«á¥i¥H¼W¥[¯S§Oªº¦¨­û¡A¨Ò¦p¹ï Rectangle Ãþ§O¼W¥[ Width ©M Height¡A¹ïCircle Ãþ§O¼W¥[ Radius¡Cª`·N³o¨Ç¬O¦³½ìªº¡A¦hºA©Ê¶É¦V©ó´î¤Ö»Ý­n¨Ï¥ÎÃþ§Oªºµ{¦¡½Xªº¼Æ¶q¡AÄ~©Ó´î¤ÖÃþ§O¥»¨­¤º³¡ªºµ{¦¡½X¡A¦]¦¹Â²¤ÆÃþ§O«ØºcªÌªº¤u§@¡C¿ò¾Ñ¦a¡AVisual Basic¨S¦³¤ä´©Ä~©Ó¡A¦Ü¤Ö¦b¥¦ªº¦h¼Æªí³æ¬O¦p¦¹¡C¤U¤@³¹¡A·|§iª¾¦p¦ó¼gµ{¦¡¤â°Ê¦a¼ÒÀÀÄ~©Ó¡A¨Ã¸ÑÄÀ¦ó®É¥B¬°¦óÄ~©Ó¦p¦¹¦³¥Î¡C

²Ä¤@­ÓÃþ§O¼Ò²Õ
¡@

¦bVisual Basic¤¤«Ø¥ßÃþ§O¬O«Ü²³æªº¡G¥u­n±q±M®×ªí³æ¤¤°õ¦æ·s¼WÃþ§O¼Ò²Õ©R¥O¡C¤@­Ó·sªºµ{¦¡½X½s¿èµøµ¡·|§e²{¥X¨Ó¡C¹w³]±¡ªp¤U¡A²Ä¤@­ÓÃþ§O¼Ò²Õ©R¦W¬° Class 1¡A©Ò¥HÀ³¸Ó­n°µªº²Ä¤@¥ó¨Æ¬O§ïÅܦ¨¾A¦Xªº¦WºÙ¡C¦b²Ä¤@­Ó¨Ò¤l¡AÅã¥Ü¦p¦ó±NÃö©ó¤Hªº­Ó¤H¸ê®Æ«Ê¸Ë¡A©Ò¥H±N²Ä¤@­ÓÃþ§O©R¦W¬°Cperson¡C


»¡©ú

·L³n«Øij¦bÃþ§O¦WºÙ«e­±¥[¤W cls¡A¦ý§Ú¨Ã¤£¿í±q¡A¦]¬°Ä±±o¥¦¨Ï±oµ{¦¡½X´î¤Ö¥iŪ©Ê¡C§Ú³q±`¸û³ßÅw¨Ï¥Î C §@¬°¿ì§OÃþ§Oªº¦r­º¡A¦³®É­Ô¬Æ¦Ü¨S¦³¥[¤W¦r­º¡A¯S§O¬O·íª«¥ó¶¥¼h¡C·íµM³o¬O­Ó¤H§e²{ªº¤è¦¡¡A¨Ã¨S¦³±j½Õµ§ªÌªº¨t²Î¤ñ¥ô¦ó¨ä¥L¤H¦³²z¡C


§Ú­Ì²Ä¤@ª©¥»ªºÃþ§O¥u¥]¬A¤Ö¼ÆªºÄÝ©Ê¡C³o¨ÇÄݩʦbÃþ§O¼Ò²Õ¥»¨­¤¤¥HPublic§@¬°«Å§i¡A¥i¥H°Ñ¦Ò­ì©l½X¡A¦p¹Ï6-1©Ò¥Ü¡G

' In the declaration section of the CPerson class module
Public FirstName As String
Public LastName As String


¡@

¹Ï6-1 «Ø¥ß¤@­ÓÃþ§O¼Ò²Õ¡A¦bÄݩʵøµ¡¤¤µ¹©wÃþ§O¦WºÙ¡A¦bµ{¦¡½s¿èµøµ¡¤¤¥[¤J¤@¨Ç¼s°ìÅܼơC

³o¬O¤@­Ó«D±`²³æªºÃþ§O¡A¦ý¹ï©óÅéÅ禳½ìªº¥DÃD¤W¤]¬O­Ó¦nªº¶}©l¡A¥i¥H¥ýÁ׶}¸Ô²Óªº²Ó¸`¡C­Y´¿¸g«Ø¥ß¤@­ÓÃþ§O¼Ò²Õ¡A¥i¥H°Ñ·Ó¦¹¤@Ãþ§O«Å§i¤@ª«¥óÅܼơG

' In a form module
Private Sub cmdCreatePerson_Click()
    Dim pers As CPerson                          ' Declare.
    Set pers = New CPerson                       ' Create.
    pers.FirstName = "John"                      ' Assign properties.
    pers.LastName = "Smith"
    Print pers.FirstName & " " & pers.LastName   ' Check that it works.
End Sub

¦¹µ{¦¡½X¨Ã«DÅý¤H«Ü¤F¸Ñ¡C¦ý¬O°O¦í³o¸Ì¶È¶È­n¶Ç¹F³o¨Ç·§©À¡Aª«¥ó¯u¥¿ªº¤O¶q«ç·í§Ú­Ì±N¤§À³¥Î©ó¹ê»ÚªºÀ³¥Îµ{¦¡®É¤è·|§e²{¡C

Auto-instancingª«¥óÅܼÆ
¡@

¤£¹³¤@¯ë«Å§i«á§Ö³t¨Ï¥ÎªºÅܼơA¦b´M¨Dª«¥óªºÄÝ©Ê©M¤èªk¤§«e¡A¤@­Óª«¥óÅܼƥ²¶·©ú½T«ü¬£µ¹ª«¥ó°Ñ·Ó¡C¹ê»Ú¤W¡A·íª«¥óÅܼƩ|¥¼¤À¬£®É¡A¬O¬°¤@­Ó¯S§Oªº Nothing ­È¡G´«¥y¸Ü»¡¡A¨Ã¨S¦³¥ô¦ó¦³®Ä­Èµ¹¹ê»Úªºª«¥ó°Ñ¦Ò¡C¬°¤FÁA¸Ñ¹ê»Úªº·N¸q¡A½Ð°Ñ·Ó¥H¤Uµ{¦¡½X¡G

Dim pers As CPerson         ' Declare the variable,
' Set pers = New CPerson    ' but comment out the creation step.
Print pers.FirstName        ' This raises an error 91 _ "Object variable
                            ' or With block variable not set"

¦h¼Æ±¡ªp¤U¡A³o¤@¦æ¬°¬O¥¿½Tªº¡A¦]¦L¥X¹ê»Ú¤W¤£¦s¦bªºª«¥óÄݩʬO¤£¨ã·N¸qªº¡CÁקK¦¹¤@¿ù»~ªº¤èªk¬O¨Ï¥Î Is Nothing ´ú¸Õª«¥óÅܼƥثeªº¤º®e¡G

' Use the variable only if it contains a valid object reference
If Not (pers Is Nothing) Then Print pers.FirstName

µM¦Ó¡A¨ä¥L±¡ªp¤U¡A¥u·Q«Ø¥ß¤@­Óª«¥ó¡A¥ô¤@ª«¥ó¡AµM«á«ü¬£¥¦ªºÄÝ©Ê¡C¦¹ºØ±¡ªp¤U¡A¥i¥Hµo²{¨Ï¥Î As New «Å§i auto-instancing ª«¥óÅܼƬOº¡¦³¥Îªº¡G

Dim pers As New CPerson        ' Auto-instancing variable

·í°õ¦æ¶¥¬q¡AVisual Basic¹J¨ìauto-instancingÅܼƪº°Ñ·Ó¡A­º¥ý½T©w¨ä¬O§_«ü¦V¦s¦bªºª«¥ó¡A·í¦³»Ý­n®É·|«Ø¥ßÃþ§Oªº·s¹êÅé¡C±zÀ³­nª¾¹DAuto-instancingÅܼƦ³­þ¨Ç»Ýª`·Nªº¦a¤è¡G

  • Auto-instancingÅܼƩúÅã´î¤Ö»Ý­n¦bÃþ§O¤¤µo¥Í©M°õ¦æªºµ{¦¡½X¼Æ¶q¡C°ò©ó¦¹¡A³q±`¦bÂú§Î´Á¶¡¬O­«­nªº¡C
    ¡@
  • Auto-instancingÅܼƵLªk¹ï¹H¤ÏNothing­È°µ´ú¸Õ¡C¨Æ¹ê¤W¡A¤@¥¹¦b Is Nothig ´ú¸Õ¤¤¨Ï¥Î¡AVisual Basic·|«Ø¥ß¤@­Ó·sªº¹êÅé¡A¥B¦¹´ú¸ÕÁ`¬O¶Ç¦^False¡C¦b¬Y¨Ç±¡ªp¤U¡A³o¬O¤@­Ó¨M©w©Ê¦]¤l¡A­n«O¯d­þ¤@­Óauto-instancingÅܼơC
    ¡@
  • Auto-instancingÅܼƷ|¦Û§Ú®ø°£¿ù»~¡A¦ý¬O¦³¨Ç®É­ÔµLªk½Tª¾±z»Ý­nªº¬O¤°»ò¡C¹ê»Ú¤W¡A¦b¶}µo¶¥¬q¤¤¡A¦]¬°¦bµ{¦¡ÅÞ¿è¤W¹ï¨ä¥LÄY­«ªº²ª¸ñ¬O¤@­Ó¼x¥ü¡A©Ò¥H·|·Q­n¬d¬Ý¿ù»~¡CAuto-instancingÅܼƳy¦¨°»¿ù¦³¤@¨Ç¼Ò½k¡A¦]¬°±q¥¼½T©wª«¥ó¦ó®É¤Î¬°¦ó³Q«Ø¥ß¡C³o¥i¯à¬O¤£­n¨Ï¥Îauto-instancingÅܼƳ̭«­nªº²z¥Ñ¡C
    ¡@
  • ¤£¯à«Å§i³qºÙÃþ§O¬°¤@­Óauto-instancingÅܼơAÄ´¦pObject¡BForm©ÎMDIForm¡A¦]¬°·í²Ä¤@¦¸°Ñ¦Ò¦¹ÅܼƮɡAVisual Basic¥²¶·ª¾¹D­þ¤@ºØÃþª«¥óÀ³¸Ó¨Æ«e³Q«Ø¥ß¡C
    ¡@
  • ¬Y¨Ç½ÆÂøªº³W«h¤¤¡A¥i¯à­n«Å§i¤@­ÓÅܼƦý¨Æ¹ê¤W±q¤£·|¥Î¨ì¥¦¡G¥¦µo¥Í¦b¤@¯ëÅܼƩMª«¥óÅܼơA¦ý¥¦²£¥Í¤@­Ó¥¿±`ªºª«¥óÅܼơ]non-auto-instancing¡^ªº°ÝÃD¡C¨Æ¹ê¤W¡A­Y¦b«Ø¥ßª«¥óªºµ{§Ç¤@¶}©l®É¡A¥Î Set ©R¥O«Ø¥ß¤@µL¹ê»Ú¥Øªºªºª«¥ó-·|ªá¶O®É¶¡¸ò°O¾ÐÅé-¡C´«¥y¸Ü»¡¡Aª½¨ì»Ý­nª«¥ó¤~°µª«¥óªº«Ø¥ß¡A«Ü§Öªº±z·|µo²{²T¨S¦b Set ©R¥O¤¤¡A¨C­Ó»Ý³z¹L IsNothing ´ú¸Õ¨ÓÁקK¦A«Ø¥ß¥ý«eªºª«¥ó¡C¬Û¤ñ¤§¤U¡A·íauto-instancingÅܼƳQ°Ñ·Ó®É¡AÅܼƷ|³QVisual Basic¦Û°Ê«Ø¥ß¡G¨Ã¨S¦³®É¶¡©Î°O¾ÐÅé·|µL½tµL¬G³Q®ö¶O¡C³o¬Oauto-instancingÅܼƤj³¡¤À¦³¥Îªº±¡ªp¡C
    ¡@
  • ³Ì«á¡A¨C¦¸Visual Basic°Ñ·Ó¤@­Óauto-instancingÅܼơA·|³y¦¨¤p¤pªº®Ä²v­°§C¡A¦]¬°¥²¶·½T»{¬O§_¬°Nothing¡C³o¤@¦¨¥»¬O·L¤£¨¬¹Dªº¡A¦ý¬O¦b¬Y¨Ç°j°é³W«h¤U¥i¯à·|¼vÅT©Ò¦³ªº®É¶¡¡C
    ¡@

Á`¦Ó¨¥¤§¡Aauto-instancingÅܼƳq±`¨Ã«D¬O³Ì¦nªº¿ï¾Ü¡A¤@¯ë¨Ó»¡©^ÄU¤£­n¨Ï¥Î¥¦¡C¥»³¹¸`¤¤¤j³¡¤Àªºµ{¦¡½X¨S¦³¨Ï¥Îauto-instancingÅܼơA³q±`¦b¦Û¤vªºÀ³¥Îµ{¦¡¤W¤]¥i¥H¤£­n¥Î¡C

Äݩʵ{§Ç
¡@

¦^¨ìCpersonÃþ§O¡A¨Ã¥B¬Ý¬Ý¦¹Ãþ§O¦p¦óÁקK¦Û¤v±µ¦¬¨ìµL®Äªº¤Þ¼Æ¡A¨Ò¦pFirstName ©Î LastName ÄÝ©Ê¥X²{ªÅ¦r¦ê¡C¬°¤F¹F¨ì³o¤@¥Øªº¡A¥²¶·§ïÅÜÃþ§O¼Ò²Õªº¤º³¡¬[ºc¡A¦]¦b¥Ø«eªºªí³æ¤¤µLªk¸É§ì«ü©w­Èµ{§Ç¡C©Ò­n°µªº¬OÂà´«³o¨Ç­È¨ìPrivate¦¨­û¡A¨Ã±N¥L­Ì«Ê¸Ë¶i¤@¹ïPropertyµ{§Ç¡C¥H¤U¬° Property Get ©M Let FirstName µ{§Çªºµ{¦¡½X¡A¦Ó¹ï©ó LastName ªºµ{¦¡½X¤]¬O¬Û¦üªº¡C

' Private member variables
Private m_FirstName As String
Private m_LastName As String

' Note that all Property procedures are Public by default.
Property Get FirstName() As String
    ' Simply return the current value of the member variable.
    FirstName = m_FirstName
End Property

Property Let FirstName(ByVal newValue As String)
    ' Raise an error if an invalid assignment is attempted.
    If newValue = "" Then Err.Raise 5    ' Invalid procedure argument 
    ' Else store in the Private member variable.
    m_FirstName = newValue
End Property

»¡©ú

±q¤u¨ã¦C¤¤¥i¥H¨Ï¥ÎAddµ{§Ç©R¥OÀx¦s¬Y¨Ç§Î¦¡¡A¦Û¤v«Ø¥ß¼È®Éªº Property Get ©M Let µ{§Ç¡C¤£¹L¡AÀ³­n½s¿èµ²ªG¡A¦]¬°¸g¥Ñ¦¹¤èªk«Ø¥ßªº©Ò¦³ÄݩʬOVariant«¬ºA¡C


¥[¤J³oµ{¦¡½X¡A¨Ã¼¶¼g³B²z LastName ªºµ{§Ç¡FµM«á°õ¦æµ{¦¡¡A¥i¥H¬Ý¨ì¨C¥ó¨Æ¬Ò¦p«e©ÒÃD¯ë¦a¹B§@¡CµM¦Ó¡A©Ò­n°µªº¬O¨ÏÃþ§OÅܱo§ó»ô¥þ¡A¦]¬°²{¦b©Úµ´«ü¬£µL®Äªº­Èµ¹¨äÄÝ©Ê¡C­n¤F¸Ñµ§ªÌªº·N«ä¡A½Ð°õ¦æ³o¤@©R¥O¡G

pers.Name = ""      ' Raises error "Invalid procedure call or argument"

­Y«ö¤UF8³v¦æªº¨Ó°lÂܵ{¦¡¡A±N·|ÁA¸Ñ³o¨âÄݩʵ{§Ç¹ê»Ú¤W¦b°µ¤°»ò¡C¨C¦¸«ü¬£¤@­Ó·sªº­Èµ¹¤@ÄÝ©Ê¡AVisual Basic·|½T»{¬O§_¦³¬ÛÃöªº Property Let µ{§Ç¡A¨Ã¥BÂà´«·sªº­Èµ¹¥¦¡C­Yµ{¦¡½X¤£¯à¨Ï·sªº­È¦³®Ä¡A·|²£¥Í¿ù»~¨Ã§â°õ¦æÅvÂǥѫü¬£­Èµ¹¿W¥ßÅÜ¼Æ m_FirstName ÁÙµ¹©I¥sªÌ¡C½Ð¦P®É²ßºD¨Ï¥Î m_ ¦r­ººû«ùÄݩʦWºÙ¨Ã©M¿W¥ßÄݩʧ@°Ï§O¡A³o¥u¬O­Ó¤Hªº·N¨£¡F¥i¦Û¥Ñ¨Ï¥Î©Î«Ø¥ß¦Û¤vªº³W«h¡C·í©I¥sªÌµ{¦¡½X­n¨DÄݩʭȮɡAVisual Basic °õ¦æ¬Û¹ïªº Property Get µ{§Ç¡A³æ¯Â²Ä¶Ç¦^­Ó§OÅܼƪº­È¡C¥Ñ Property Let µ{§Ç²£¥Íªº«¬ºA¥²¶·²Å¦X¥Ñ Property Get µ{§Ç©Ò¶Ç¦^ªº­È¤§«¬ºA¡C¹ê»Ú¤W¡A´N¥Ø«eVisual Basic©Ò¤Î¡AÄÝ©Ê«¬ºA¬O Property Get µ{§Ç©Ò¶Ç¦^ªº«¬ºA¡C¡]·í¸ÑÄÀÅܼÆÄݩʮɳo°Ï¤À·|§ó¦³·N¸q¡C¡^

¨Ï¤@ÄݩʭȦ³®Äªº¯u¥¿·N¸q¬O¤°»ò¨Ã«D«Ü²M·¡¡C¦³¨ÇÄݩʦbÃþ§O¤§¥~±z©Ò¨S¦Ò¼{¨ìªº¬OµL®Äªº¡CÄ´¦p¡A¨S¦³³s±µ¨ì¸ê®Æ®wªºProducts¤£¯à¨ÏProduct¦³®Ä¡C²³æ¦a»¡¡A·s¼W¤@­Ó·sªº BirthDate ÄÝ©Ê¡A¦b¦X²z±¡ªp¤U¦³®Ä¡G

Private m_BirthDate As Date

Property Get BirthDate() As Date
    BirthDate = m_BirthDate
End Property
Property Let BirthDate(ByVal newValue As Date)
    If newValue >= Now Then Err.Raise 1001, , "Future Birth Date !"
    m_BirthDate = newValue
End Property

¤èªk
¡@

Ãþ§O¼Ò²Õ¤]¥i¥H¥]§tSub©MFunctionµ{§Ç¡C¦b¨ä¥L«¬ºAªº¼Ò²Õ¤¤¡AFunction¤èªk©MSub¥u¦³¤@­Ó¤£¦P¡A´N¬OFunction¤èªk¥i¥H¶Ç¦^­È¡A¦ÓSub¤èªk«h¤£¶Ç¦^­È¡C¬JµMVisual Basic¥i¨Ï¥Î¤£¶Ç¦^­ÈªºFunction¡A©Ò¥Hµ§ªÌ³q±`³ßÅw«Ø¥ß¶Ç¦^²Ä¤GºØ­ÈªºFunction¤èªk¡G·íÃþ§Oªº¨Ï¥ÎªÌ¹ê»Ú¤W¤£»Ý­n¶Ç¦^­È®É¡Aµ{§Ç¤ºÁÙ¬O¥i¥[¤J­Èªº¡C

¦b³o²³æªºCpersonÃþ§O¤¤¤°»ò¤èªk¬O¦³¥Îªº¡H·í¶}©l³B²z³\¦h¤Hªº°O¿ý®É¡A¥i¥H»´©öµo²{¤@¦Ó¦A¦A¦Ó¤T¦C¦L¥X©Ò¦³¤Hªº§¹¾ã©m¦W¡C¦]¦¹¤]³\·Q­n³]­p¥X¤@­Ó§Ö³t²³æ¦C¥X¥þ¦Wªº¤èªk¡C­n¸Ñ¨M¦¹¤@²³æ¤u§@ªº«ä¦Òµ{§Çªk¡A¥i¦b¥þ°ìBAS¼Ò²Õ¤¤«Ø¥ß¤@­ÓFunction¡G

' In a BAS module
Function CompleteName(pers As CPerson) As String
    CompleteName = pers.FirstName & " " & pers.LastName
End Function

·í¦¹¤@µ{¦¡½X¹B§@¡A¥¦¨Ã«D¬O°õ¦æ¦¹¤@¤u§@³Ì¦nªº¤èªk¡C¨Æ¹ê¤W¡A¥þ¦W·§©À¹ïÃþ§O¨Ó»¡¬O¤º³¡ªº¡A©Ò¥H¯Ê¥F¤@­Ó¾÷·|¨Ï±oÃþ§O§óÁo©ú§ó®e©ö¨Ó¨Ï¥Î¡C°£¦¹¤§¥~¡A·|¨ÏÃþ§O¥»¨­Åܦ¨«ÜÃø¦A§Q¥Î¡A¦]¬°²{¦b±z±N¥¦ªº¥\¥Î´²§G¦b©Ò¦³ªºÀ³¥Îµ{¦¡¤¤¡C³Ì¦nªº¤èªk¬O¦bCpersonÃþ§O¤¤·s¼W¤@­Ó·sªº¤èªk¡G

' In the CPerson class
Function CompleteName() As String
    CompleteName = FirstName & " " & LastName
End Function

' In the form module, you can now execute the method.
Print pers.CompleteName          ' Prints "John Smith"

·í¦bÃþ§O¼Ò²Õ½d³ò¤º¡A¤£»Ý­n¥HÂI²Å¸¹¨Ó°Ñ·Ó¥Ø«e¨Ò¤lªºÄÝ©Ê¡C´«¥y¸Ü»¡¡A­Y¦bÃþ§O¼Ò²Õ½d³ò¤¤¡A¨Ã¥B°Ñ·Ó¤@¤½¶}ªºÄݩʦWºÙ¡]FirstName¡^¦Ó«D¬Û¹ïªº­Ó§Oªº¸s²ÕÅܼÆ(m_FirstName)¡A°²­Y¦¹ÄݩʬO¥~³¡ªºÃþ§O©Ò°Ñ·Ó¡A«hVisual Basic·|°õ¦æ Property Get µ{§Ç¡C¨Æ¹ê¤W¡AÀ³¸Ó¹Á¸Õ¥h°í«ù¥H¤Uªºªk«h¡G¥u¦³±q¬Û¹ïªº Property Let / Get µ{§ÇªºÃþ§O¤¤°Ñ·Ó°Ï°ìªº¸s²ÕÅܼơC°²­Y¤§«á­×§ïÄݩʤº³¡ªºµ²ªG¡A¥u¥²¶·­×¥¿Ãþ§O¼Ò²Õ¤¤¤@¤p³¡¤Àªºµ{¦¡½X¡C¦³®ÉµLªkÁקKµ{¦¡½Xªº­×¥¿¡A¦ý¬OÀ³¸Ó¥þ¤O¥H­u¨ÓÀ³¥Î¦¹¤@³W«h¡C¤@¥¹ÁA¸Ñ¦¹¤@§@¥Î¡A¥i¥H¹ï±zªºÃþ§O¼W¥[³\¦h¯à¤O¡A¦p¥H¤Uµ{¦¡½X©Ò¥Ü¡G

Function ReverseName() As String
    ReverseName = LastName & ", " & FirstName
End Function

°O±o±z­è­è¼W¥[µ{¦¡½X¡A¨Ã¥B¦b°õ¦æ¶¥¬q¤¤¨S¦³ÃB¥~ªº°O¾ÐÅé¨ÓÀx¦s§¹¥þ©M¬Û¤Ï¦WºÙªº­È¡C

¹ïÃþ§O¼W¥[¶V¦hªº¯à¤O¡A¨Ï¥Î³o¤@Ãþ§Oªº³]­p®v¶V°ª¿³¡C¦³ÃöÃþ§O³Ì­«­nªº¤@¥ó¨Æ¬O¼W¥[ªº©Ò¦³¤èªk©MÄÝ©Ê·|¥ß§Y¦bª«¥óÂsÄý¾¹¤W¬Ý¨ì¡AÁÙ¦³¥L­Ì§¹¾ãªº»yªk¡C°²³]¤p¤ß¦a¿ï¾Ü±zªºÄÝ©Ê©M¤èªkªº¦WºÙ¡A«h¹ï¨C­Ó¤£¦Pªº¤u§@¿ï¨ì¹ïªºµ{§Ç¥i»¡Åܦ¨¸û¦³½ìªº¡C

Class Initialize¨Æ¥ó
¡@

·í¶}©l«ØºcÃþ§O¡A±z±Nµo²{±`»Ý­n¦bª«¥ó¥»¨­«Ø¥ß®É¡A§Y«ü©w¤@­Ó©w¸q¦nªº­Èµ¹ÄÝ©Ê¡A¦Ó«D¦b©I¥sªÌµ{¦¡½X¤¤«ü©w¡C¨Ò¦p¡A°²³]³B²zEmployeeª«¥ó¡A¥i¦X²zªº»{¬°¡A¦b¤j³¡¤Àªº¨Ò¤l¤¤¡A¥¦ªº Citizenship ÄݩʬOAmerican¡]©ÎªÌ¥ô¦ó©~¦íªº°Ï°ì¡^¡CÃþ¦ü¦a¡A¤j¦h¼Æ¦b°²©wªºµo²¼ª«¥ó¤¤¡AAddressFrom ÄݩʱN¥i¯à²Å¦X©Ò¤u§@ªº¤½¥q¦a§}¡C·í«Ø¥ßª«¥ó®É¡A·Q­n«ü©w³o¨Ç¹w³]­È¡A¦Ó¤£¬O¥²¶·¦b¨Ï¥Î¨ìÃþ§Oªºµ{¦¡½X¤¤¤â°Ê¦a«ü©w¡C

Visual Basic´£¨Ñ¤@­Ó¤£¿ùªº¤èªk¨Ó¹F¨ì³o­Ó¥Ø¼Ð¡C¨Æ¹ê¤W¡A©Ò¥²¶·­n°µªº¬O¦bÃþ§O¼Ò²Õªº Class_Initialize ¨Æ¥ó¤W¼g¤@¨Ç±Ô­z¡C¥Î½s¿è¾¹¹ï¦¹¨Æ¥óµ{§Ç«Ø¥ß¤@­Ó¼Ò¤l¡A¦bµ{¦¡½s¿è°Ï¤¤¿ï¾Ü°µ¥ªÃäcombo box±±¨î¶µªºClass¿ï¶µ¡CVisual Basic¦Û°Ê±q³Ì¥kÃ䪺¤U©Ô¦¡±±¨î¶µ¤¤¿ï¾Üªì©l¿ï¶µ¡A¨Ã¥B·s¼W¼Ëª©¨ì½s¿èµøµ¡¤¤¡C Citizenship Äݩʪº¹w³]­È¬°American¡G

' The Private member variable
Private m_Citizenship As String

Private Sub Class_Initialize()
    m_Citizenship = "American"
End Sub
' Code for Public Property Get/Let Citizenship procedure ... (omitted)

°²­Y²{¦b­n°õ¦æ¨ì¥Ø«e¬°¤î©Ò«Ø¥ßªºªºµ{¦¡¨Ã¥B°lÂܤ§¡A·|¬Ý¨ìVisual Basic¥ß§Y«Ø¥ßª«¥ó¡]¦bªí³æ¼Ò²Õªº Set ©R¥O¡^¡AClass_Initialize ¨Æ¥ó³QIJµo¡Cª«¥ó·|³Q¶Ç¦^µ¹©I¥sªÌ¡A¨Ã±N©Ò¦³ÄÝ©Ê¥¿½Tªì©l¤Æ¡A¤£¥²«ü©w¥L­Ì¡CClass_Initialize ¨Æ¥ó¦³¤@­Ó¬Û¹ïÀ³ªº Class_Terminate ¨Æ¥ó¡A·íª«¥ó³QVisual Basic³QºR·´®É·|IJµo¡C¦b³o¤@µ{§Ç¤¤¡A³q±`·|Ãö³¬¥´¶}ªºÀɮשM¸ê®Æ®w¨Ã°õ¦æ¨ä¥L²M°£¤u§@¡C¦b¥»³¹«á­±·|Á¿¨ì Class_Terminate ¨Æ¥ó¡C

°»¿ùÃþ§O¼Ò²Õ
¡@

¤j³¡¤ÀªºÆ[ÂI¤W¡A¹ïÃþ§O¼Ò²Õ¤º³¡ªºµ{¦¡½X°»¿ù¨Ã«D»Pµ{¦¡½X¡]ªí³æ¼Ò²Õ¤¤¡^°»¿ù¦³¦ó¤£¦P¡C¦ý¬O·í¦³¼Æ­Ó¬Û¤¬¼vÅTªºª«¥ó¡A«h¥i¯à·|°g¥¢¦bµ{¦¡½X¤¤¡C©Òµ¹©wªº³o¤@Àþ¶¡¡A¬Ý¨ìªº¬O­þ­Ó¯S©w¹êÅé¡H¥Ø«eÄݩʬO¤°»ò¡H·íµM¡A¥i¥H¨Ï¥Î©Ò¦³ªº°»¿ù¤u¨ã-¥]¬A Debug.Print ±Ô­z¡Bdata tips¡BInstant Watchµ¥µ¥¡C¦p¹Ï6-2©Ò¬Ý¨ìªº¬OLocalsµøµ¡¡C¥u­n¶}µÛ³o­Óµøµ¡¡A¥i¥Hª¾¹D¥ô¦ó®É¶¡©Ò¦bªº¦ì¸m¡Aµ{¦¡½X¦p¦ó¼vÅTª«¥óÄݩʵ¥µ¥¡C


¡@

¹Ï6-2 ·í³B²z¦h­Óª«¥ó®É¡A°Ï°ìÅܼƵøµ¡¬O¤@­Ó¤£¿ùªº°»¿ù¤u¨ã¡C

MeÃöÁä¦r
¡@

¦³®ÉÃþ§O¥²¶·°Ñ·Ó¥»¨­ªºµ{¦¡½X¡C¨Ò¦p·í¤@­Óª«¥ó¥²¶·±q¦Û¨­¶Ç²Ä¤@­Ó°Ñ·Óµ¹¨ä¥Lµ{§Ç®É¡A³o¬O¦³»Ý­nªº¡C³o¥i¥H¨Ï¥Î Me ÃöÁä¦r¡C¥H¤U²³æªºµ{¦¡¤¤¡A¦bBAS¼Ò²Õ¤¤·Ç³Æ¨â­Ó¤@¯ë¥Î³~ªºµ{§Ç¡A¨äÀ°§U¬ö¿ýª«¥ó¦ó®É³Q«Ø¥ß¥B³QÄÀ©ñ¡C

' In a Standard BAS module
Sub TraceInitialize (obj As Object)
    Debug.Print "Created a " & TypeName(obj) _
        & " object at time " & Time$
End Sub
Sub TraceTerminate (obj As Object)
    Debug.Print "Destroyed a " & TypeName(obj) _
        & " object at time " & Time$
End Sub

©³¤U¬°¦p¦ó±qCPersonÃþ§O¼Ò²Õ¨Ó¨Ï¥Î³o¨Çµ{§Ç¡G

Private Sub Class_Initialize()
    TraceInitialize Me
End Sub

Private Sub Class_Terminate()
    TraceTerminate Me
End Sub

MeÃöÁä¦rÁÙ¦³¨ä¥L¥Îªk¡A¦b³oÃäÁÙ¦³¤U¤@³¹¥i¥H¬Ý¨ì¡C

ÄÝ©Ê¡B¤èªk©M¨Æ¥ó
¡@

³oÃä­n«ü¥X¦p¦ó¥¿½T¨Ï¥Î¨ì¥Ø«e¬°¤îªº©Ò¦³¯à¤O¡C§Ú·|Ä~Äòµo®iCpersonÃþ§O°µ¬°¨Ò¤l¡A¥H¥¦¨Ó¤¶²Ð·s·§©À¡G

°ßŪ©M°ß¼gÄÝ©Ê
¡@

­Y¬Ý¨ìVisual Basic©w¸q¦Û¤v¥»¨­ªºª«¥ó¡]ªí³æ¡B±±¨î¶µµ¥µ¥¡^¡A¥iª`·N¨ì¨Ã«D©Ò¦³ªºÄݩʳ£¥i¥HŪ¨ú©M¼g¤J¡CÁ|¨Ò¨Ó»¡¡A¦b°õ¦æ¶¥¬q¤¤µLªk­×¥¿ListBox±±¨î¶µªº MultiSelect ÄÝ©Ê¡A¬Æ¦Ü¦b³]­p¶¥¬qµLªk­×¥¿ComboBoxªº°ª«×¡C®Ú¾Ú±zÃþ§Oªºª¬ªp¡A¥i¥H¦³³\¦h¦n²z¥Ñ¨Ó­­¨î¦s¨úÄÝ©Ê¡A¨Ï¥¦­Ì°ßŪ©Î°ß¼g¡]¸û¤Ö¥X²{¡^¡C

°ßŪÄÝ©Ê
¡@

Á¿¨ì·Q­n¦bCpersonÃþ§O·s¼W¤@­ÓAgeÄÝ©Ê¡C®Ú¾Ú BirthDate ÄÝ©Ê¡A¦]¦¹À³¸Ó¬O°ßŪÄÝ©Ê¡C¦bVisual Basic¤¤¬Ù²¤ Property Let µ{§Ç¥i¨Ï±oÄݩʦ¨¬°°ßŪ¡C

Property Get Age() As Integer
    Age = Year(Now) - Year(BirthDate)
End Property

¬°¤FÃÒ¹ê²{¦b¦³¤@­Ó°ßŪÄÝ©Ê¡A¹Á¸Õ°õ¦æ¦¹¬qµ{¦¡½X¡G

pers.Age = 50

¤@¥¹¹Á¸Õ°õ¦æµ{¦¡·|³y¦¨Visual Basic½sĶ¿ù»~¡Aª½¨ì§ï¥¿©Î§R°£¦¹¬q±Ô­z¤~¯à½sĶµ{¦¡¡C

°ß¼gÄÝ©Ê
¡@

°¸º¸¡A¥i¯à¬Æ¦Ü·Q­n«Ø¥ß¤@­Ó°ß¼gÄÝ©Ê¡C¨å«¬ªº¨Ò¤l¬Oµêºcªºµn¤Jª«¥óªºPassword ÄÝ©Ê¡C¦¹¤@ÄÝ©Ê¥i³Q«ü©w¥h»{ÃÒµn¤J³B²z¡A¦ý¤£À³¸Ó¬O¥iŪªº¥H«K¤£»PÀ³¥Î¨t²Î¥»¨­ªº¦w¥þ©Ê¬Û§´¨ó¡C¦bVisual Basic¤¤¡A¹³³o¼Ëªº°ß¼gÄÝ©Ê¥i¥HÂǥѼ¶¼g Property Let µ{§Ç¦P®É©¿²¤¬Û¹ïªº Property Get µ{§Ç¨Ó¹ê²{¡C

Private m_Password As String

Property Let Password(ByVal newValue As String)
    ' Validate the password, raise error if not valid.
    ' ...
    ' If all is OK, assign to Private member variable.
    m_Password = newValue
End Property

¦Ñ¹êªº»¡¡A³o¯S§OªºVisual Basic¯S©Ê³q±`¨S¦³¤°»ò¥Î³~¡A¦ý¬°¤F§¹¾ã©Êµ§ªÌ¤~§iª¾¡C°ß¼gÄݩʳq±`¥O¤H·P¨ì§x´b¡A¥B¦h¼Æ¶}µoªÌı±o¤£¦ÛµM¡C­Y»Ý­n¤@­Ó°ßŪÄÝ©Ê¡A§Ú¤ñ¸û³ßÅw«Ø¥ß¤@­Ó¥i±µ¨ü­È§@¬°°Ñ¼Æªº¤èªk¡]¦b¦¹¥i¬° SetPassword¡^¡C

¼g¤@¦¸¡þŪ¦h¦¸ªºÄÝ©Ê
¡@

¼g¤@¦¸¡þŪ¦h¦¸¡]Write-once/read-many¡^Äݩʤñ°_¯Âºéªº°ß¼gÄÝ©Ê­n¨Óªº¦³½ì¥B¦³¥Î¡C¨Ò¦p¡A¥ý«e´y­zªºLoginDialogª«¥ó¥i¯à¦³¦¹Ãþ«¬ºAªº UserName ÄÝ©Ê¡C¤@¥¹¤@­Ó¨Ï¥ÎªÌµn¤J¡A±zªºµ{¦¡½X«ü¬£¥L©Î¦oªº¦W¦rµ¹¦¹ÄÝ©Ê¡AµM«áÀ³¥Î¨t²Îªº¨ä¥L³¡¤À¥i¥HŪ¨ú¥¦¦ý¤£¯à­×¥¿¥¦¡C³o¸Ì¦³¥t¤@­Ó¹ê¨Ò¡G¦b Invoice Ãþ§O¡ANumber ÄÝ©Ê¥i³Q·í§@¤@­Ówrite-once/read-manyÄÝ©Ê¡A¦]¬°¤@¥¹±z«ü©w¤@­Ó¼Æ¦rµ¹µo²¼«á¡A¥ô·N§ïÅÜ¥¦¥i¯à³y¦¨¦b·|­p¨t²ÎÄY­«ªº°ÝÃD¡C

Visual Basic¨S¦³´£¨Ñ¾A·íªº¨t²Î¨Ó°õ¦æ¹³³o¼Ëwrite-once/read-manyÄÝ©Ê¡A¦ý¬O¥Î¤@¨ÇÃB¥~ªºµ{¦¡½X«K¥i®e©ö¦a¹F¦¨¡C°²³]­nÅýCpersonÃþ§O¦³­Ó ID ÄÝ©Ê¡A¦¹ÄÝ©Ê¥u¥i³Q«ü©w¤@¦¸¦ý¥i³QŪ¨ú¦h¦¸¡C³o¦³­Ó¥i¯àªº¸Ñ¨M¤èªk¡A¨Ì¾a¤@­ÓÀRºAªºÅÞ¿èÅܼơC

Private m_ID As Long

Public Property Get ID() As Long
    ID = m_ID
End Property
Public Property Let ID(ByVal newValue As Long)
    Static InitDone As Boolean
    If InitDone Then Err.Raise 1002, , "Write-once property"
    InitDone = True
    m_ID = newValue
End Property

³o¸Ì¦³¥t¤@­Ó¸Ñ¨M¤èªk¡AÄË¥XÃB¥~ªºÀRºAÅܼƦý¦b°O¾ÐÅ餤¨Ï¥Î¤@¨ÇÃB¥~ªº¦ì¤¸²Õ¡]16¦ì¤¸²Õ´À¥N6¦ì¤¸²Õ¡^¡C

Private m_ID As Variant

Public Property Get ID() As Long
    ID = m_ID
End Property
Public Property Let ID(ByVal newValue As Long)
    If Not IsEmpty(m_ID) Then Err.Raise 1002, , "Write-once property"
    m_ID = newValue
End Property

³o¨â­Ó±¡ªp¡AÃþ§O¹ï¥~ªº¤¶­±¬O¤@¼Ëªº¡]ID ¬O¤@ªøÄÝ©Ê¡^¡C³o¬O­Ó¦nªº«Ê¸Ë¬[ºc¡A¨äÅý±z§ïÅÜÃþ§Oªº¤º³¡¹ê§@¦Ó¤£¼vÅT¨Ï¥Î¥¦ªºµ{¦¡½X¡C

°ßŪÄÝ©Ê©M¤èªk
¡@

±q¥Î¤áºÝµ{¦¡Æ[ÂI¨Ó¬Ý¡]¹ê»Ú¨Ï¥Î±zªºÃþ§Oªºµ{¦¡½X¡^¡A°ßŪÄݩʬۦü©ó¨ç¼Æ¡C¨Æ¹ê¤W¡A©Ò¦³±¡ªp¤U¡A°ßŪÄÝ©Ê¥u¥i¦b³¯­z¥y¤¤¨Ï¥Î¡A¥B±q¤£¥X²{¦b«ü¬£²Å¸¹ªº¥ªÃä¡C©Ò¥H³o¤Þµo³\¦h»yªkªº°ÝÃD¡G¦ó®É®É°µ°ßŪÄݩʬO³Ì¦nªº¡A¥B¦ó®É¨Ï¥Î¨ç¼Æ¬O§ó¦nªº¡Hµ§ªÌµLªk´£¨Ñ³W«h¡A¥H¤U¬O¤@¨Ç«Øij¡G

  • ¤j³¡¤Àµ{¦¡³]­p®v´Á±æÄݩʦbÃþ§O¤¤¬O­Ó§Ö³tÁä¡C­Y±z¥¿«Ø¥ßªºµ{§Ç¤j¦h¼Æ·|¶Ç¦^¤@­ÓÀx¦s¦bÃþ§O¼Ò²Õªº­È¡A©Î¥i¥H¥[§Ö²©öªº­pºâ®É¡A«Ø¥ßÄÝ©Ê¡C¦]¬°³o¬O¥Î¤áºÝµ{¦¡¯à¥H¥ô¦ó¤è¦¡¬Ý¨ì¥¦ªº¥i¯à¤èªk¡C­Yµ{§Ç¤j¦h¼Æ»Ý¨D­pºâ½ÆÂøªº­È¡A¨Ï¥Î¨ç¼Æ¡C
    ¡@
  • ­Yµo²{©I¥sµ{§Ç©M±Ë±ó¥¦ªº¶Ç¦^­È¬O¦³¥Îªº®É¡]´«¨¥¤§¡A³o¬O«Ü­«­nªº¡Aµ{§Ç©Ò°µ±o¨Æ»·¶W¹L¨ä­n¶Ç¦^ªº¡^¡A«h¨Ï¥Î¨ç¼Æ¡CVBAÅý±z©I¥s¨ç¼Æ¦n¹³°Æµ{¦¡¯ë¡A¤£¥i¯à¦³ Property Get µ{§Ç¡C
    ¡@
  • ­Y¥i¥H·Q¹³¥¼¨Ó¥Ñµ{§Ç¶Ç¦^ªº­È¬O¥i¥H³Q«ü©w¡A¨º´N¨Ï¥Î Property Get µ{§Ç¡A«O¦s¤@­Ó¾÷·|¨Ó¼W¥[ Property Let µ{§Ç¡]·í»Ý­n®É¡^¡C
    ¡@

»¡©ú

·í±z¹Á¸Õ«ü¬£­Èµ¹°ßŪÄݩʸò¹Á¸Õ«ü¬£­Èµ¹¨ç¼Æ©Òµo¥Íªº¨Æ¬O¦³¨Ç·L¤£¦P¡C¹ï©ó«e¤@­Ó¨Ò¤l¡A·|±µ¦¬¨ì¤@­Ó¿ù»~°T®§-"¤£¯à«ü¬£¨ì°ßŪÄÝ©Ê"-¦b«á­±ªº¨Ò¤l¡A«h·|±o¨ì§ó¦h¿ù»~°T®§¢w"©I¥s¥ª°¼ªº¨ç¼Æ¥²¶·¶Ç¦^ÅܼƩΪ«¥ó"¡C³o©_©Ç°T®§ªº¯u¥¿·N«ä·í±zŪ¨ì¥»³¹«á­±ª«¥óÄݩʮɱN·|§ó²M·¡¡C


²{¦b¨úCpersonÃþ§Oªº CompleteName ¦¨­û°µ¬°¨Ò¤l¡C¥¦¤w¸g³Q·í§@¤èªk¨Ó¹ê§@¡A¦ý¦h¼Æªºµ{¦¡³]­p®v±NªÖ©w¦a»{¬°¥L¬O¤@­Ó°ßŪÄÝ©Ê¡C¦A¨Ó¡A³o¬O«D±`­«­nªº¤@ÂI¡A¨S¦³¥ô¦óªF¦èªý¤î±z»{¬°¥L¬O¤@­Ó¥iŪ¼gªºÄÝ©Ê¡C

Property Get CompleteName() As String
    CompleteName = FirstName &; " " &; LastName
End Property
Property Let CompleteName(ByVal newValue As String)
    Dim items() As String
    items() = Split(newValue)
    ' We expect exactly two items (no support for middle names).
    If UBound(items) <> 1 Then Err.Raise 5
    ' If no error, assign to the "real" properties.
    FirstName = items(0): LastName = items(1)
End Property

ÂǥѥH¦ÛµMªº¤è¦¡Åý¥Î¤áºÝµ{¦¡«ü¬£ FirstName ©M LastName¡A«K¼W¥[¤FÃþ§Oªº¥i¥Î©Ê¡A¨Ò¦pª½±µ¦Ûªí³æÄæ¦ì¨Ó±o¨ì¸ê®Æ¡G

pers.CompleteName = txtCompleteName.Text

·íµM±z¤´µM¥i¥H«ü¬£¿W¥ßªºFirstNmae ©M LastName ÄÝ©Ê¡A¦Ó¤£»Ý­n¥Î CompleteNmae Äݩʫإߤ£¤@­Pªº¤u§@¡C³o¬O¤@­Ó±z¥i¥H¨Ï¥Îªº¥i·R¤p§Þ¥©¡C

¦³¤Þ¼ÆªºÄÝ©Ê
¡@

¨ì¥Ø«e¬°¤î¡AÁ¿¨ìªº Property Get µ{§Ç³£¨S¦³¥ô¦óªº¤Þ¼Æ¡A¥L­Ì¬Û¹ïªºProperty Let µ{§Ç¥u¦³¤@­Ó¤Þ¼Æ¡A¦¹¤Þ¼Æ³Q«ü¬£µ¹¦¹µ{§Ç¡CVisual Basic¤]¥iÅý±z«Ø¥ß±µ¦¬µL¼Æ­Ó¥ô¦ó«¬ºA¤Þ¼ÆªºÄݩʵ{§Ç¡C³o·§©À¤]³QVisual Basic±±¨î¶µ©Ò¨Ï¥Î¡G¨Ò¦p¡AListBox±±¨î¶µªº List Äݩʱµ¨ü¤@­Ó¼Æ¦r«¬ºAªº¯Á¤Þ¡C

Åý§Ú­ÌÁ@Á@¦¹·§©À¦p¦óÀ³¥Î¨ìCperson³o­Ó²³æªºÃþ§O¡C°²³]±z»Ý­n¤@­Ó Notes ÄÝ©Ê¡A¦ý¦P®É±z¤£·Q­n­­¨î¦Û¤v¥u¦³¤@­Ó¶µ¥Ø¡C²Ä¤@­Ó¸Ñ¨M¤èªk¬O¨Ï¥Î¤@­Ó°}¦C¦r¦ê¡C¿ò¾Ñ¦a¡A­Y±z¦p¤U«Å§i¤@­Ó¤½¶}°}¦C¦bÃþ§O¼Ò²Õ¤¤¡C

Public Notes(1 To 10) As String        ' Not valid!

½sĶ¾¹·|¥X²{¥H¤Uªº°T®§¡A¡§±`¼Æ¡B©T©wªø«×¦r¦ê¡B°}¦C¡B¦Û¦æ©w¸q«¬ºA©M«Å§i±Ô­z¤£¤¹³\·í§@ª«¥ó¼Ò²Õªº¤½¶}¦¨­û"¡C¦ý±z¥i¥H«Ø¥ß¤@­ÓPrivate°}¦C¦¨­û¡A¨Ã¹ï¥~¨Ï¥Î¤@²ÕPropertyµ{§Ç¨Ó¤½¶}¥L¡C

' A module-level variable
Private m_Notes(1 To 10) As String

Property Get Notes(Index As Integer) As String
    Notes = m_Notes (Index)
End Property
Property Let Notes(Index As Integer, ByVal newValue As String)
    ' Check for subscript out of range error.
    If Index < LBound(m_Notes) Or Index >UBound(m_Notes) Then Err.Raise 9
    m_Notes(Index) = newValue
End Property

ª`·N

±z¥i¯à¤£·|¥h½T»{¦b¥ý«eµ{¦¡½X¤¤ Property Let µ{§ÇªºIndex ¤Þ¼Æ¡A¦Ó¨Ì¾aVisual Basicªº¹w³]¦æ¬°¡A³o¥i¯à·|¤Þµo¿ù»~¡C¦A¦¸¦Ò¼{¤§¡A¨Ã¸ÕµÛ·Q¹³­Y±z¤§«á¨M©wÂǥѳ]©wRemove Array Bounds Checks¨Ó³Ì¨Î¤Æ±zªºµ{¦¡½X®É·|µo¥Í¤°»ò¨Æ±z¡C


²{¦b±z¥i¥H«ü¬£¥B¨ú±o¹ï¬Û¦P¤Hªº³Ì¦h¤Q­Ó¤£¦Pªº¬ö¿ý¡A¦p¤U¦Cµ{¦¡¡G

pers.Notes(1) = "Ask if it's OK to go fishing next Sunday"
Print pers.Notes(2) ' Displays "" (not initialized)

ÂÇ¥ÎÅý Index §@¬°¿ï¾Ü©Ê¤Þ¼Æ¡A¥B¹w³]¬°°}¦Cªº²Ä¤@­Ó¶µ¥Ø¥i¥H§ïµ½¦¹¾÷¨î¡Aµ{¦¡½X¦p¤U¡G

Property Get Notes(Optional Index As Integer = 1) As String
    ' ... (omitted: no need to change code inside the procedure)
End Property
Property Let Notes(Optional Index As Integer = 1, _
    ByVal newValue As String)
    ' ... (omitted : no need to change code inside the procedure)
End Property

' In the client code, you can omit the index for the default note.
pers.Notes = "Ask if it's OK to go fishing next Sunday"
' You can always display all notes with a simple For-Next loop.
For i = 1 To 10: Print pers.Notes(i): Next

¤]¥i¥H¨Ï¥Î¿ï¾Ü©ÊVariant¤Þ¼Æ©M IsMissing ¨ç¼Æ¡A¦p¦P¦bªí³æ©Î¼Ð·Ç¼Ò²Õªº¤@¯ëµ{§Ç¯ë°µªk¡C¦b¹ê§@¤W¡A³o«Ü¤Ö³Q­n¨D¡A¦ý­Y»Ý­n®É¡A±z¥iª¾¹D¬O¥i¥H³o¼Ë°µªº¡C

¦bÃþ§O¤¤§@¬°¤½¶}ÅܼƪºÄÝ©Ê
¡@

§Ú¤w¸g±Ô­z¨Ï¥Î Property Get ©M Let µ{§Çªº¤è«K©Ê¡A´À¥NÃþ§Oªº¤½¶}ÅܼơG±zÀò±o§ó¦h±±¨î¡A¥i¥HÅçÃҨϫü¬£µ¹Äݩʪº¸ê®Æ¡A¥i¥H°lÂÜ°õ¦æ¬yµ{µ¥µ¥¡C¦ý¬O³o¸Ì¦³¤@­Ó§ó¦³½ìªº±¡§Î¡A±zÀ³¸Ó·NÃѨì§Y¨Ï«Å§i¤@­Ó¤½¶}ÅܼơAVisual Basic¹ê»Ú¤W©Ò°µ±o¬O¬°±z«Ø¥ß¤@¹ïÁôÂ桪ºÄݩʵ{§Ç¡A¤£½×¦ó®É±z±qÃþ§O¥~³¡°Ñ·Ó¨ì³o¤@Äݩʮɧ¡·|©I¥s¥L­Ì¡C

' Inside the CPerson class
Public Height As Single  ' Height in inches

' Outside the class
pers.Height = 70.25      ' This calls a hidden Property Let procedure.

°£¤F¤p¤pªº°õ¦æ®Ä²v¥~-IJ¤Î¤@­Óµ{§Ç¤ñ¦s¨ú¤@­ÓÅܼƽT©wÁÙºC-³oVisual Basic¦æ¬°¨Ã¤£­È±o´£°_¡C¿ò¾Ñ¦a¡A³o¨Ã¤£³q¥Î¡C°²³]·Q­n§â©Ò¦³±zªº´ú¶qªk§ï¦¨¤½¤À¡A±o·Ç³Æ¤@­Ó²³æªºµ{§Ç¡A¥Î ByRef ¤Þ¼Æ¨Ó¹B§@¡C

' In a standard BAS module
Sub ToCentimeters (value As Single)
    ' Value is received by reference, therefore it can be changed.
    value = value * 2.54
End Sub

±z»{¬°¥i¹ïª«¥óÄݩʪºÂ²³æÂà´«¦³­Ó¦Xªk¦a´Á±æ¡G

ToCentimeters pers.Height                ' Doesn't work!

¥ý«e¤èªk¥¢±Ñªº²z¥ÑÀ³¸Ó«Ü²M·¡¡A²{¦b±zª¾¹D¤½¶}ÅܼƳQ·í§@ÁôÂ꺵{§Ç¨Ó°õ¦æ¡C¨Æ¹ê¤W·í±z¶Ç»¼ pers.Height ­Èµ¹ ToCentimeters µ{§Ç®É¡Aªí¥Ü¥¿¶Ç»¼ªí¥Ü¦¡ªºµ²ªG¡A¦Ó¤£¬O¹ê»Úªº°O¾ÐÅé¦ì§}¡C¦]¦¹¡Aµ{§Ç¤u§@¨S¦³°O¾ÐÅé¨Ó«ü¥Ü¶Ç»¼·sªº­È¨ì¦ó³B¡AÂà´«µ²ªG·|¿ò¥¢¡C


ª`·N

Microsoft§ïÅÜÃþ§O¼Ò²Õ¤º¤½¶}ÅܼƳQ°õ¦æªº¤è¦¡¡C¦bVisual Basic 4¡A³o¨ÇÅܼƨS³QÁôÂæ¡Äݩʵ{§Ç©Ò«Ê¸Ë¡F¦]¦¹¡A­Y³z¹L ByRef ¤Þ¼Æ¶Ç»¼µ¹µ{§Ç¡A¥L­Ì¥i³Q­×§ï¡C·íVisual Basic 5¥X²{¡A¹ê§@¹Lµ{§ïÅܤF¡A³\¦hVisual Basic 4³]­p®v¥²¶·¹ï¥L­Ìµ{¦¡½X­«·s»s§@¡AÂǥѫإ߹ê»Ú±µ¦¬·s­Èªº¼È¦sÅܼơC

' The fix that VB4 developers had to apply when porting to VB5
Dim temp As Single
temp = pers.Height
ToCentimeter temp
pers.Height = temp

³o¬qµ{¦¡½X¤£º}«G¤]¨S¦³®Ä²v¡C§óÁVªº¬O¡A¬JµM¦¹§Þ¥©¨S¦³²M·¡ªº¤å¥ó»¡©ú¡A³\¦hµ{¦¡³]­p®v¥²¶·¦Û¤v²z¸Ñ¡C­Y±z±N±qVisual Basic 4Âà¦V²Ä¤­ª©©Î²Ä¤»ª©¡A¤£±o¤£´£¨¾¡C


µL½×¦p¦ó¡A³o¸Ì¦³¥t¤@­Ó¥¼³zÅSªº¨Æ¥ó¡C¨ì¥Ø«e¬°¤î§Ú»¡Á¿ªº¬O·í±qÃþ§O¥~³¡°Ñ·Ó¤½¶}ÅܼƩҵo¥Íªº¨Æ¡C­Y±z±qÃþ§O¼Ò²Õ¤º³¡Ä²¤Î¥~­±ªºµ{§Ç¡A¶Çµ¹±zªºÅܼơA¨C¤@­Ó¨Æ±¡¦p¹w´Á¯ëµo¥Í¡C´«¨¥¤§¡A±z¥i¥H¦bCperson¼g³oµ{¦¡½X¡G

' Inside the CPerson class
ToCentimeter Height                ' It works!

Height ÄݩʱN·|¥¿½T¦a§ó·s¡C¦¹±¡ªp¤U¡A³Q¶Ç»¼ªº­È¬OÅܼƪº¦ì§}¡A¦Ó¤£¬OÁôÂ桵{§Çªº¶Ç¦^­È¡C­Y·Q­n±qÃþ§O¥~³¡±Nµ{¦¡½X²¾¨ìÃþ§O¤º³¡¡]©ÎªÌ¬Û¤Ï¡^¡A³o¤@ÂI¬O­«­nªº¡A¦]¬°¥²¶··Ç³Æ³B²z¹³³o¼ËÃø®»ºNªºÄ³ÃD¡C


ª`·N

³Ì«á¤@ÂI»Ýª`·Nªº¡G­Y¦bÃþ§O¼Ò²Õ¤¤¥Î Me ÃöÁä¦r¥[¦bÄÝ©Ê«e§@¬°¦r­º¡A¥L­Ì¦A«×¬Ý°_¨Ó¹³¬OÄݩʦӫDÅܼơA«hVisual Basic·|±Ä¥ÎÁôÂõ{§Ç¦Ó«DÅܼƦì§}¡C¦]¦¹¡A¦¹¤@µ{¦¡¦bÃþ§O¼Ò²Õ¤º³¡µLªk¹B§@¡C

ToCentimeter Me.Height             ' It doesn't work!

Methodªº¶i¶¥¨Ï¥Î
¡@

±z¤w¸gª¾¹D³\¦hÃö©óMethodªº¨Æ¡CµM¦Ó¡A³o¸ÌÁÙ¦³¨Ç§ó¦³½ìªº¨Æ¡A±zÀ³¸Ó¤F¸ÑÃö©óMethod¦p¦ó¦b¤@­ÓÃþ§O¼Ò²Õ¤¤¨Ï¥Îªºª¬ªp¡C

Àx¦s³s¦ê©I¥sªºµ²ªG
¡@

°²³]¦³­Ó¨ç¼Æ¶Ç¦^¤@­Ó½ÆÂøªº­È¡Ð¨Ò¦p¡Aµo²¼ªºÁ`ÃB¡Ð¥B¤£·Q­n¨C¦¸¥Î¤áºÝµ{¦¡§@¤@­Ó­n¨D®É«K­pºâ¤@¦¸¡C´«¥y¸Ü»¡¡A±z¤£·Q­n¦b¬Y³BÀx¦s¥¦¡A¥B¦]¬°µo²¼ªº¬Y¨ÇÄݩʧïÅܮɾɭP¨ä­ÈÅܦ¨µL¥Î¡C³o«Ü¹³¸ê®Æ®w¶}µoªÌ­n°µªº¨M©w¡G«Ø¥ß¤@­Ó¥]§t¯u¥¿­Èªº GrandTotal Äæ¦ì¡]¥i¯à¯}Ãa¸ê®Æ®wªº§¹¾ã©Ê¥B®ö¶OµwºÐªÅ¶¡¡^©Î¨C¦¸»Ý­n®É­pºâÁ`ÃB¡]¦p¦¹°µ·|®ö¶OCPU®É¶¡¡^¡A­þ­Ó¬O¸û¦nªº¡H

Ãþ§O¼Ò²Õ´£¨Ñ¤@­Ó²³æ¥i¿ï¾Üªº¤èªk¡A¹ï©Ò¦³¬ÛÃö³s­ÈªºÀ³¥Î¬Û·í¦n¡A³Q·í§@¨ç¼Æ©Î°ßŪÄݩʦb°õ¦æ¡CÁ|¨Ò¨Ó»¡¡A¦A·Q·QCpersonÃþ§Oªº ReverseName ¨ç¼Æ¡A¥B°²³]ªá¶O¤Ó¦h³B²z®É¶¡¨Ó­pºâ¥¦ªº­È¡C³o¸Ì±Ð±z¦p¦ó­×¥¿¦¹¨ç¼Æ¥H«O«ù³Ì§C¦¨¥»¡A¦Ó«D­×¥¿Ãþ§O¹ï¥~ªº¤¶­±¡]¼W¥[ªº±Ô­z¥H²ÊÅéªí¥Ü¡^¡C

' A private member variable
Private m_ReverseName As Variant

Property Let FirstName(ByVal newValue As String)
    ' Raise an error if an invalid assignment is attempted.
    If newValue = "" Then Err.Raise 5    ' Invalid procedure argument
    ' Else store in the Private member variable.
    m_FirstName = newValue
    m_ReverseName = Empty
End Property

Property Let LastName(ByVal newValue As String)
    ' Raise an error if an invalid assignment is attempted.
    If newValue = "" Then Err.Raise 5    ' Invalid procedure argument
    ' Else store in the Private member variable.
    m_LastName = newValue
    m_ReverseName = Empty
End Property

Function ReverseName() As String
    If IsEmpty(m_ReverseName) Then
        m_ReverseName = LastName &; ", " &; FirstName
    End If
    ReverseName = m_ReverseName
End Function

´«¨¥¤§¡A¶Ç¦^¨ì¥Î¤áºÝ¤§«e¡A±N­ÈÀx¦s¦bPrivate VariantÅܼơA¥B¥i¦b«á¨Óªº©I¥s¤¤¦A§Q¥Î³o¤@­Ó­È¡C¦]¬°¨C¦¸¤£½× Firstname ©Î Lastname ³Q«ü¬£¤@­Ó·sªº­È¡BPrivateÅܼƳQ²M°£¡A¨ä¾É­P¤U¦¸ ReverseName ¨ç¼Æ³QIJµo·|±j­¢¦A­«·s­pºâ¡CÀˬd³o²³æ¥Î¤áºÝµ{¦¡¡A¨Ã¹Á¸Õ»¡©ú¨Ï¥Î¨ä¥L§Þ³N¹ê§@¬Û¦PÅ޿観¦h§xÃø¡G

' This line takes some microseconds the first time it is executed.
If pers.ReverseName <> "Smith, John" Then 
    ' If this line is executed, it internally resets m_ReverseName.
    pers.FirstName = "Robert"
End If
' In all cases, the next statement will be as fast as possible.
Print pers.ReverseName

·íµM¡A§Ú­Ì¥i¯à¤]¥i¦b FirstNmae ©Î LastNmae ªº Property Let µ{§Ç¤¤­«·s­pºâ m_ReverseName ­È¡A¦ý¨º·|¯}Ãa§Ú­Ì¥D­nªº¥Ø¼Ð¡]ÁקK¤£¥²­nªº¦¨¥»»P©µ»~¡^¡C¦b¹ê»ÚÀ³¥Î¤W¡A®t§O¬O¥i¯à²o¯A¤£¥²­nªº¸ê®Æ®w¶}±Ò¡B¦A«Ø¥ß»·ºÝ³s±µµ¥µ¥¡A©Ò¥H¦¹§Þ¥©ªºÀuÂI¥i¯à·|³Q±»»\±¼¤F¡C

¼ÒÀÀÃþ§O«Øºc¨ç¦¡
¡@

§Ú¤§«e´¿¸ÑÄÀ¹L¦pªG¦³¤@­ÓÃþ§O¤@©w¥]§t¦³®Ä¸ê®Æ®É¡A¦¹Ãþ§O«h³Qµø¬°±j©Tªº¡C¹F¦¨¦¹¥Ø¼Ðªº¥D­n¤èªk¬O´£¨Ñ¤@­ÓPropertyµ{§Ç©M¤èªk¡A¦¹Propertyµ{§Ç©M¤èªk¤¹³\¥~³¡ªºµ{¦¡½X¥u±N¤º³¡¸ê®Æ¥Ñ¤@­Ó¦³®Äª¬ºA§ïÅܦ¨¥t¤@­Ó¦³®Äª¬ºA¡CµM¦Ó³oºØ¤è¦¡¦³¤@­Ó¦MÀIªº¯Ê¥¢¡G¦pªG¤@­Óª«¥ó¦b«Ø¥ß¤§«á¥ß§Yªº³Q¨Ï¥Î«h·|µo¥Í¤°»òª¬ªp©O¡H§A¥i¥H¦bClass_Initialize¨Æ¥óµ{§Ç¤¤´£¨Ñ¤@¨Ç¦³¥Îªºªì©l­È¤Î¦³®Ä­È¡A¦ý¦p¦¹«oµLªk½T©w©Ò¦³ªºµ{§Ç³£¦b¦³®Äªºª¬ºA¤U¡G

Set pers = New Cperson
Print pers.CompleteName            ' Displays an empty string.

¦b³\¦h°·¥þªºOOPL¤¤´N¹³C++¡A³o­ÓijÃD¥iÂǥѩw¸q«ØºcªÌ¡]constructor¡^©Ò¸Ñ¨M¡C«ØºcªÌ¬O­Ó¯S§Oªºµ{§Ç¡A³Q©w¸q¦bÃþ§O¼Ò²Õ¤¤¡A¥B·í·sªº¹êÅé³Q«Ø¥ß®É«K°õ¦æ¡C¦]¬°©w¸q«ØºcªÌªº»yªk¡A¥i¥H±j­¢¥Î¤áºÝµ{¦¡¶Ç»¼±q¤@¶}©lªº°·¥þª¬ºA»Ý­n«Ø¥ßª«¥ó©Ò»Ý­nªº­È¡A©ÎªÌ­Y­È³Q¬Ù²¤©ÎµL®Ä®É¡A©Úµ´«Ø¥ßª«¥ó¡C

Visual Basic§¹¥þ¯Ê¤Ö«ØºcªÌ¡A¥B±zµLªk¹w¨¾Ãþ§O¨Ï¥ÎªÌ«Ø¥ßª«¥ó«á§Y¨Ï¥Î¥¦¡C©Ò­n°µªº³Ì¦nªº¬O«Ø¥ß¤@­Ó pseudo-constructor ¤èªk¡A¥¿½T¦aªì©l¤Æ©Ò¦³ªºÄÝ©Ê¡A¥BÅý¨ä¥L³]­pªÌª¾¹D¥L­Ì¥i¥H²­nªº©M°·¥þªº¤è¦¡¨Óªì©l¤Æª«¥ó¡G

Friend Sub Init(FirstName As String, LastName As String)
    Me.FirstName = FirstName
    Me.LastName = LastName
End Sub

±zªº­n¨DÀ³·|«Ü°ª¿³³Q±µ¨ü¡A¦]¬°²{¦b¥Î¤áºÝµ{¦¡¥i¥H¥Î¸û¤Öªº¨BÆJ¨Óªì©l¤Æª«¥ó¡G

Set pers = New Cperson
pers.Init "John", "Smith"

¦b¤§«eªºµ{¦¡¤¤¦³¨â­ÓijÃD­È±oª`·N¡C²Ä¤@¡A¤èªkªº½d³ò¬OFriend¡G¦b¦¹±¡ªp¤U¨Ã¨S¦³¥ô¦ó¤£¦P¡A¦ý·í¥B­YÃþ§OÅܦ¨¤½¶}¥B±q¥~­±¥i¶i¤J¥¦®É±NÅܦ¨­«­nªº¡A²Ä16³¹·|»¡¨ì¡C¦b¼Ð·ÇEXE±M®×¡A¤Íµ½©M¤½¶}¬O¬Û¦Pªº¡F¨Ï¥Î«eªÌ¨Ã¨SÃö«Y¡A¥B­Yµy«á¨M©wÂà´«±M®×¬°ActiveX¤¸¥ó®É¡A±N·|¸`¬Ù³\¦h¤u§@¡C

²Ä¤GÂI­È±oª`·Nªº¬O¡A¤Þ¼Æ»P¨ä«ü¦VªºÄݩʦ³µÛ¬Û¦Pªº¦WºÙ¡A¨Ï±o¤w¸gª¾¹D¨CÄÝ©Ê·N¸qªº³]­p®v¯à§ó²³æ¦a¨Ï¥Îpseudo-constructor¡C¬°¤FÁקK¦WºÙªº½Ä¬ð¡A¦bµ{§Ç¤º³¡¨Ï¥Î Me ÃöÁä¦r«ü¦V¹ê»ÚªºÄÝ©Ê¡C³oµy·L¨S¦³®Ä²v¡A¦ý¥i«O¦s¸ê®Æªº¤@­P©Ê¡A¥B½T«O¥ô¦ó¦³®Äªºµ{¦¡½X±N³Q¾A·í°õ¦æ¡A·í«ØºcªÌ«ü©w­Èµ¹ÄݩʮɡC

«ØºcªÌÁÙ¥i¥H¨Ï¥Î¿ï¾Ü©Ê¤Þ¼Æ¡CCpersonÃþ§OªºÃöÁäÄݩʬO FirstName ©MLastName¡A¦ý¦b³\¦h¨Ò¤l¤¤¥Î¤áºÝµ{¦¡¤]³]©w BirthDate ©M ID¡C©Ò¥H¹ï©ó¨Ï¥ÎÃþ§Oªº³]­p®v¬°¤°»ò¤£Åý¤u§@Åܱo²³æ¨Ç©O¡H

Friend Sub Init(FirstName As String, LastName As String, _
    Optional ID As Variant, Optional BirthDate As Variant)
    Me.FirstName = FirstName
    Me.LastName = LastName
    If Not IsMissing(ID) Then Me.ID = ID
    If Not IsMissing(BirthDate) Then Me.BirthDate = BirthDate
End Sub

¦b³o­Ó±¡ªp¤U¡A±z¥²¶·¨Ï¥ÎVariant«¬ºAªº¿ï¾Ü©Ê¤Þ¼Æ¡A¦]¬°¹ï©ó¨Ï¥Î ISMissing ¨ç¼Æ©M²¤¹L¥Î¤áºÝ¥¼´£¨Ñªº­È¨Ó»¡¬O¥²­nªº¡C

pers.Init "John", "Smith", , "10 Sept 1960"

±z¥i¥H§@§ó¦hªº¨Æ±¡¨Ó§ïµ½Ãþ§Oªº¥i¥Î©Ê¡A¨Ã³Q¨ä¥L³]­p®v±µ¦¬¡C³o¯uªº«Ü­«­n¡A¦]¬°­Y¯à¯à°÷»¡ªAÃþ§O¨Ï¥ÎªÌ¨Ó©I¥s±z´£¨Ñªº«ØºcªÌ¡Ð¨Ã¥B±z¥²¶·±Ä¨ú¬X³n«ººA¡A¦]¬°µLªk±j­¢¥L­Ì¡Ð±zªºµ{¦¡½X©M§¹¾ãªºÀ³¥Îµ{¦¡±N·|§ó°·¥þ¡C§Ú«Øijªº§Þ¥©¬O¦bÀ³¥Îµ{¦¡ªºBAS¼Ò²Õ¤º¼g¤@­Ó«ØºcªÌ¨ç¼Æ¡C

Public Function New_CPerson(FirstName As String, LastName As String, _
    Optional ID As Variant, Optional BirthDate As Variant) As CPerson
    ' You don't even need a temporary local variable.
    Set New_CPerson = New CPerson
    New_CPerson.Init FirstName, LastName, ID, BirthDate
End Function

³o¤@Ãþ«¬ªºµ{§Ç¦³®É¥s°µ factory ¤èªk¡C²{¦b¬Ý¤@¤U³o¦p¦ó¥i¥H«Ø¥ß¤@­ÓÃþ§O¹êÅ骺³¡¤À¥Î¤áºÝµ{¦¡½X¡G

Dim pers As Cperson
' Creation, initialization, and property validation in one step!
Set pers = New_CPerson("John", "Smith", , "10 Sept 1960")

¤p¯µ³Z

·í¨Ï¥Î³o¨Ç«ØºcªÌ®É¡A¥i¥H´î¤Ö¥´¦r©M²q´ú¡A­Y±N¥L­Ì»E¶°¦bBAS¼Ò²Õ¤º¡A¨Ã¥Bµ¹³o¼Ò²Õ¤@­Ó²©öªº¦WºÙ¡A¨Ò¦p Class ©Î Factory¡]©êºp¡AµLªk¨Ï¥Î New¡^¡CµM«á·í»Ý­n¿é¤J«ØºcªÌ¦WºÙ®É¡A¥u­n¥´¤J Class¡AÅýMicrosoft IntelliSense³z¹L¥]§t¦b¦¹¼Ò²Õ¤¤ªº«ØºcªÌªº¤@¦ê¦Cªí¨Ó«ü¤Þ±z¡C±z¥i¦b¤£°O±o¦b¼Ò²Õ¤ºµ{§Ç¦WºÙ®É¨Ï¥Î³o¤@­Ó¤èªk¡C


ÂǥѩúÅ㪺«ØºcªÌ¨Ó«Ø¥ß©Ò¦³ªºª«¥óÁÙ¦³¨ä¥L¦n³B¡CÄ´¦p¡A¥i¥H²³æ¦a¦bNew_Cperson µ{§Ç¤¤¼W¥[¤@¨Ç°lÂܱԭz¨Ó¬ö¿ý¦h¤Öª«¥ó³Q«Ø¥ß¡BÄݩʪì©l­È©M¨ä¥Lµ¥µ¥¡C¤£­n§C¦ô³o­Ó¥\¯à¡A­Y±z¥¿¦b¼g¨Ï¥Î³\¦hÃþ§O¼Ò²Õ©Mª«¥ó¹êÅ骺½ÆÂøÀ³¥Îµ{¦¡®É¡C

Äݩʪº¶i¶¥¨Ï¥Î
¡@

µ§ªÌ­n§i¶D±z§ó¦h¦³Ãö¥i¥H¨ÏÃþ§O§ó¦³¥Î§ó¦³¤OªºÄÝ©Ê¡C

«ü©úÄÝ©Ê
¡@

¬Y¨ÇÄݩʬO¹w´Á±N¶Ç¦^¤@²Õ©w¸q¦nªº¾ã¼Æ­È¡C¨Ò¦p¡A¥i¥H¹ê§@ MaritalStatus ÄÝ©Ê¡A¦¹Äݩʦ³¤U¦C´XºØ­È¡G1 (NotMarried)¡B2 (Married)¡B3 (Divorced)©M 4 (Widowed)¡C¦bVisual Basic4¤@­Ó³Ì¥i¯àªº¸Ñ¨M¤èªk¬O©w¸q¤@²Õ±`¼Æ¡A¥B¦bÃþ§O¤º³¡©M¥~³¡¤@­P¦a¦bµ{¦¡½X¤¤¨Ï¥Î¥¦¡CµM¦Ó¡A³o­Ó¹ê§@±j­¢¶}µoªÌ©ñ¸m CONST «ü¥O¦bBAS¼Ò²Õ¡A¯}ÃaÃþ§Oªº«ÊÂê¡C

Visual Basic 5·s¼W¤@­Ó·sªº Enum ÃöÁä¦r¡]¨ä¯à°÷«Ø¥ß«ü©ú­È¡^¡A¸Ñ¨M¤F¦¹Ä³ÃD¡CEnum ¬[ºc¥u¤£¹L¬O­Ó¦Û°Ê¨ú±o³æ¤@­Èªº¤@¸s¬ÛÃö±`¼Æ­È¡C

' In the declaration section of the class
Enum MaritalStatusConstants
    NotMarried = 1
    Married
    Divorced
    Widowed
End Enum

¤£»Ý­n«ü©w©ú½Tªº­Èµ¹ Enum µ²ºcªº©Ò¦³¶µ¥Ø¡G¹ï©ó©Ò¦³¬Ù²¤ªº­È¡AVisual Basic¶È¶È»¼¼W¥ý«eªº­È¡]©Ò¥H¦b¥ý«eªºµ{¦¡½X¤¤Married¬O 2¡A Divorced¬O3µ¥µ¥¡^¡C­Y¬Ù²¤²Ä¤@­Ó­È¡AVisual Basic¹w³]¬°0¡C¦ý¦]¬°·íÃþ§O³Q«Ø¥ß®É¡A0¹ï¥ô¦ó¾ã¼ÆÄݩʨӻ¡¬O¹w³]­È¡Aµ§ªÌÁ`¬O³ßÅw¨Ï¥¦«Ü©ú½T¥H«K©ó©¹«á¥i®·®»¥¼ªì©lªº­È¡C

©w¸q¤@­Ó Enum µ²ºc«á¡A¥i¥H«Ø¥ß¤@­Ó¬ÛÃö«¬ºAªº¤½¶}ÄÝ©Ê¡G

Private m_MaritalStatus As MaritalStatusConstants

Property Get MaritalStatus() As MaritalStatusConstants
    MaritalStatus = m_MaritalStatus
End Property
Property Let MaritalStatus(ByVal newValue As MaritalStatusConstants)
    ' Refuse invalid assignments. (Assumes that 0 is always invalid.)
    If newValue<= 0 Or newValue > Widowed Then Err.Raise 5
    m_MaritalStatus = newValue
End Property

¨Ï¥Î«ü©úÄݩʪº¦n³B¬OÅܦ¨¤@¤ÁÅܱoªí­±¤Æ¡A·í±z¨Ï¥Î¥L­Ì¨Ó¼¶¼gµ{¦¡½X®É¡C¨Æ¹ê¤W¡A©¯Á«IntelliSense¡A¤@¥¹±z«ö¤Uµ¥¸¹Áä®É¡AVisual Basic½s¿è¾¹·|¦C¥X©Ò¦³¥i¥Îªº±`¼Æ¦Cªí¡A¦p¹Ï6-3¡C¦AªÌ¡A©Ò¦³©w¸qªº«ü©úÄݩʪ½±µ¦bª«¥óÂsÄý¾¹¤¤¥X²{¡A©Ò¥H¦b¦¹±z¥i¥H½T»{¨C­Ó¿W¥ß¶µ¥Øªº¹ê»Ú­È¡G


¡@

¹Ï6-3 ·í¥Î«ü©úÄݩʮɡA¨Ï¥ÎIntelliSense¨Ó¥[§Ö¥´¦r¡C

·í³B²z Enum ­È®É¡A³o¸Ì¦³¨Ç±z¥²¶·ª¾¹Dªº²Ó¸`¡G

³Ì«á¤@ÂI¤×¨ä­«­n¡A§Ú±j¯P«Øij±z¦³­Ó¹ï©Ò¦³«ü©ú±`¼Æ²£¥Í°ß¤@¦WºÙªº¤èªk¡C­Y¥¢±Ñªº¸Ü¡A½sĶ¾¹·|©Úµ´½sĶ±zªºÀ³¥Îµ{¦¡¡A¨Ã²£¥Í "¹îı¤£²M·¡ªº¦WºÙ¡G"<itemname>" ªº¿ù»~¡CÁקK¦¹¤@°ÝÃDªºÂ²³æ¤èªk¬O¹ï©Ò¦³«ü©ú±`¼Æ¼W¥[¿W¯Sªº2¦Ü3­Ó¦r­º¡C

Enum SexConstants
    sxMale = 1
    sxFemale
End Enum

ÁקK°ÝÃDªº¥t¤@­Ó¤èªk¬O¨Ï¥Î§¹¾ãªº enumname.constantname »yªk¡A·í­nªí¥Ü¤@­Ó¤£²M·¡ªº Enum ¦¨­û®É¡Aµ{¦¡½X¦p¤U¡G

pers.MaritalStatus = MaritalStatusConstants.Married

Enum ­È¤£»Ý­n·Ó¶¶§Ç»¼¼W¡C¨Æ¹ê¤W¡A¥i¥H´£¨Ñ²æÂ÷¶¶§Çªº¯S§O­Èµ¹¬Y¨Ç¯S®í±ø¥ó¡A¦p¤U¡G

' In a hypothetical Order class
Enum OrderStatusConstants
    osShipping = 1
    osBackOrder 
    osError = -9999   ' Tip: use negative values for such special cases.
End Enum

¥t¤@­Ó¨S¦³³sÄò©Êªº«ü©úÄݩʪº±`¨£½d¨Ò¬O¦ì¤¸Äæ¦ìÄÝ©Ê¡A¦p¤U¡G

Enum FileAttributeConstants
    Normal = 0              ' Actually means "no bit set"
    ReadOnly = 1            ' Bit 0
    Hidden = 2              ' Bit 1
    System = 4              ' Bit 2 
    Directory = 16          ' Bit 3
    Archive = 32            ' Bit 4
End Enum

Áö»¡«ü©úÄÝ©Ê«D±`¦³¥Î¡A¥B¤¹³\Àx¦s¤@¨Ç´y­z©Ê¸ê°T¦b4¦ì¤¸²Õªº°O¾ÐÅé¡A±z¤£¸Ó§Ñ°O¿ð¦­¥²¶·¨ú¥X©M¸ÑĶ¦¹¸ê°T¡A¥B¦³¨Ç®É­Ô¬Æ¦Ü¦b±zªº¨Ï¥ÎªÌ­±«eÅã¥Ü¥¦¡C°ò©ó¦¹¡Aµ§ªÌ³q±`·s¼W¤@­Ó°ßŪÄݩʵ¹µ§ªÌªºÃþ§O¡A¦¹ÄݩʶǦ^«ü©úÄݩʪº´y­z¡C

Property Get MaritalStatusDescr() As String
    Select Case m_MaritalStatus
        Case NotMarried: MaritalStatusDescr = "NotMarried"
        Case Married: MaritalStatusDescr = "Married"
        Case Divorced: MaritalStatusDescr = "Divorced"
        Case Widowed
            If Sex = Male Then     ' Be precise for your users.
                MaritalStatusDescr = "Widower"
            ElseIf Sex = Female Then
                MaritalStatusDescr = "Widow"
            End If
        Case Else
            Err.Raise 5            ' Defensive programming!
    End Select
End Property

¹ï©ó³o¤Ö¼Æ¸ê°T¦ü¥G±o°µ³\¦h¨Æ¡A¦ý¬O±z·|«Ü°ª¿³©ó¥²¶·¨C¦¸¦b¿Ã¹õ©Î³øªí¤¤Åã¥Ü³o¨Ç¸ê°T¡C±z¥i¯à·Qª¾¹D¬°¦ó§Ú¼W¥[¤@­Ó Case Else °Ï¶ô¡]¥H²ÊÅéÅã¥Ü¡^¡C²¦³º m_MaritalStatus ÅܼƵLªk³Q«ü¬£¶W¥X½d³òªº­È¡A¦]¬°¥¦³Q Property Let MaritalStatus µ{§Ç©Ò«OÅ@¡A¹ï§a¡H¦ý±zÀ³¸Ó±q¥¼§Ñ°OÃþ§O³q±`¬O³v¨Bµo®i¡A¤µ¤Ñ¬O¹ïªº©ú¤Ñ¥i¯à·|§ïÅÜ¡C¥Î¨Ó´ú¸ÕÄݩʪº¦³®Ä½d³òªº©Ò¦³ÅçÃÒµ{¦¡½X¥i¯àÅܦ¨¼o±óªº¡A¤@¥¹¨S¦³ª`·N¥¦ªº¸Ü¡CÁ|¨Ò¨Ó»¡¡A­Yµy«á¼W¥[²Ä¤­­Ó MaritalStatus ®É·|µo¥Í¤°»ò¨Æ¡C¨C¦¸¼W¥[¤@­Ó·sªº«ü©ú­È¡A±z½T¹ê³z¹Lµ{¦¡½X´M§ä¥i¯àªº¿ù»~¡H©úÅã¦a´ú¸Õ Select Case °Ï°ì¤¤ªº©Ò¦³­È¡A¨Ã©Úµ´¨º¨ÇµLªk¹F¨ìªº­È¡C Case Else »yªk¬OºØ¨¾¿m©Êªºµ{¦¡½X¡A­Y¤£·Q­n¤§«áªá¶O¤Ó¦h®É¶¡¨Ó°»¿ùµ{¦¡½Xªº¸Ü¡AÀ³­n±`¥Î¦¹ºØ¤è¦¡¡C

³o¸Ì¦³­Ó²³æªº§Þ¥©¡AÅý±z¦w¥þ¦a¼W¥[¤@­Ó·sªº±`¼Æ¡AµL¶·»Ý¦b¬Û¹ïªº Property Set µ{§Ç¤¤­×¥¿ÅçÃÒµ{¦¡½X¡C¥u­n¦b©w¸q Enum ¬[ºc¤¤©ú¥Õ©w¸q³Ì¤jªº±`¼Æ¡A¨ú¥N´ú¸Õ¬O§_¹H¤Ï³Ì¤j±`¼Æ¡C

Enum MaritalStatusConstants
    NotMarried = 1
    Married
    Divorced
    Widowed
    MARITALSTATUS_MAX = Widowed    ' Uppercase is easier to spot.
End Enum

Property Let MaritalStatus(ByVal newValue As MaritalStatusConstants)
    ' Refuse invalid assignments. (Assumes that 0 is always invalid.)
    If newValue <= 0 Or newValue > MARITALSTATUS_MAX Then Err.Raise 5
    m_MaritalStatus = newValue
End Property

µM«á·í±z¦b Enum °Ï¶ô²K¥[±`¼Æ¡A»Ý­n¨ÏMARITALSTATUS_MAX¶µ¥Ø«ü¦V·sªº³Ì¤j­È¡C­Y¼W¥[¤@¬qµù¸Ñ¡A¦p¥ý«eªºµ{¦¡½X¤¤¡A±z´X¥G¤£·|©¿²¤¥¦¡C

¥i¶Ç¦^ª«¥óªºÄÝ©Ê
¡@

Visual Basic¦Û¤vªºª«¥ó¥i¯à¦³¥i¶Ç¦^ª«¥ó­ÈªºÄÝ©Ê¡C¨Ò¦p¡Aªí³æ©M©Ò¦³¬Ýªº¨ìªº±±¨î¶µ¦³­Ó Font ÄÝ©Ê¡A¦¹Äݩʨ̧ǥi¶Ç¦^Fontª«¥ó¡C±z¤F¸Ñ³o¬O­Ó¯S®íªº±¡ªp¡A¦]¬°±z¥i¥H¦bÄݩʦWºÙ¼W¤J¡§ . ¡¨¡AIntelliSense·|§iª¾ª«¥óªºÄݩʦWºÙ¡G

Form1.Font.Bold = True

Visual Basic³B²z¦Û¤vªºª«¥óªº¤è¦¡¤]¥i¥Î¦b±z¦Û­qªºÃþ§O¤¤¡C³o¹ï©ó±zOOPªº¥i¯à©Ê¤j¼W¡C¨Ò¦p¡ACPersonÃþ§O¤´µM¯Ê¤Ö Address ÄÝ©Ê¡A¨º»ò³o¬O¼W¥[ªº®É¾÷¡C¦b¦h¼Æªº±¡ªp¤U¡A¤@­Ó³æ¤@ªºAddress¦r¦êµLªk½T¤Á«ü¥X¤@­Ó¤Hªº©~¦í¦a¡A³q±`Áٻݭn¤@¨Ç¬ÛÃöªº¸ê°T¡C«Ø¥ß¤@­Ó·sªºCAddressÃþ§O¨Ó´À¥N·s¼W¦h¼ÆÄݩʵ¹Cpersonª«¥ó¡C

' The CAddress class module
Public Street As String
Public City As String
Public State As String
Public Zip As String
Public Country As String
Public Phone As String
Const Country_DEF = "USA"  ' A default for Country property

Private Sub Class_Initialize()
    Country = Country_DEF
End Sub
Friend Sub Init(Street As String, City As String, State As String, _
    Zip As String, Optional Country As Variant, Optional Phone As Variant)
    Me.Street = Street
    Me.City = City
    Me.State = State
    Me.Zip = Zip
    If Not IsMissing(Country) Then Me.Country = Country
    If Not IsMissing(Phone) Then Me.Phone = Phone
End Sub
Property Get CompleteAddress() As String
    CompleteAddress = Street &; vbCrLf &; City &; ", " &; State &; " " &; Zip _
        &; IIf(Country <> Country_DEF, Country, "")
End Property

²©ö°_¨£¡A©Ò¦³Äݩʬҫŧi¬°Public¡A¦]¦¹³oÃþ§O¤£¬O°·¥þªº¡C¦b¹ê»Úªº¨Ò¤l¤¤¡AÁÙ¥i°µ³\¦h¤£¿ùªº¨Æ¨ÏÃþ§O¦¨¬°¦nªºµ{¦¡½X¡A¨Ò¦p½T»{ City¡BState ©M Zip ÄÝ©Ê»P¨ä¥L¬Û®e¡C¡]±z¥i¯à»Ý­n¦b¸ê®Æ®w¶i¦æ¹ï·Ó¬d¸ß¡^¡C¬Æ¦Ü¥i¥H¦Û°Ê´£¨Ñ¤@°Ï°ì½Xµ¹ Phone ÄÝ©Ê¡C§ÚªYµM¦a¯d¤U³o¨Ç¾÷¨îµ¹ÅªªÌ°µ¬°½m²ß¡C²{¦b¡AÅý§Ú­Ì¦^¨ì¦p¦óÅý¦¹·sÃþ§O»PCperson¤¬°Ê¡C¼W¥[¤@­Ó·sªº HomeAddress Äݩʵ¹CPersonÃþ§O¡A¥u»Ý­n¦b¼Ò²Õ«Å§i°Ï°ì¤¤¼g¤@¦æµ{¦¡½X¡C

' In the CPerson class module
Public HomeAddress As Caddress

²{¦b¥i¥H«Ø¥ßCaddressª«¥ó¡Aªì©l¤Æ¥¦ªºÄÝ©Ê¡AµM«á±N¥¦«ü¬£µ¹­è«Ø¥ßªºHomeAddress ÄÝ©Ê¡C©¯Á« Init µêÀÀ«ØºcªÌ¡A±z¥i¥H´î¤Ö¹ê»Ú¦b¥Î¤áºÝ»Ý­nªºµ{¦¡½X¼Æ¶q¡G

Dim addr As Caddress
Set addr = New CAddress
addr.Init "1234 North Rd", "Los Angeles", "CA", "92405"
Set pers.HomeAddress = addr

Áö»¡³oºØ¤èªk¬O«Ü¥\¯à¤Æ¥BÅÞ¿è¤W¥¿½Tªº¡A¦ý´N¬O¦³ÂI¤£¦ÛµM¡C¦¹°ÝÃD°_·½©ó¥²¶·¦b«ü¬£¥¦µ¹ HomeAddress ÄÝ©Ê«e©ú¥Õ¦a«Ø¥ß¤@­ÓCaddressª«¥ó¡C¬°¦ó¤£ª½±µ¨Ï¥Î HomeAddress ÄÝ©Ê¡H

Set pers.HomeAddress = New Caddress
pers.HomeAddress.Init "1234 North Rd", "Los Angeles", "CA", "92405"

·íÀ³¥Î±_ª¬ª«¥óÄݩʮɡA±z¥i¨Ï¥Î With...End With »yªk¡G

With pers.HomeAddress
    .Street = "1234 North Rd"
    .City = "Los Angeles"
    ' etc.
End With

¦p¥ý«e©Ò¥Ü¡A¦b¼Ð·ÇªºBAS¼Ò²Õ¥i¥H´£¨Ñ¤@­Ó¿W¥ßªº«Øºc¤èªk¡A¦Ó¤£»Ý­n¤À¶}ªº Set ±Ô­z¡G

Set pers.HomeAddress = New_CAddress("1234 North Rd", "Los Angeles", _
    "CA", "92405")

Property Setµ{§Ç
¡@

¦³­Ó¥²¶·­±¹ïªº¤p°ÝÃD¬O¯Ê¥F¹ï«ü¬£¨ì HomeAddress Äݩʪº±±¨î¡C¦p¦ó¯à½T»{«ü¬£¤@­Ó¤£°·¥þ©ÎµL®ÄªºCaddressª«¥óµ¹ HomeAddress ÄݩʮɡA¨S¦³°ÝÃD·|µo¥Í©O¡H¥B­Y¬O»Ý­nÅý HomeAddress Äݩʬ°°ßŪ®É©O¡H

¤@¦p±z©Ò¬Ý¨ìªº¡A·í³B²z¤@¯ë¡A«Dª«¥óªºÄݩʮɡA±z¤]­±¹ï¬Û¦Pªº°ÝÃD¡A¥Ñ©óProperty Get ©M Property Let µ{§Ç¥i¸Ñ¨M³o¨Ç°ÝÃD¡C©Ò¥H¤F¸Ñ¥i¥H¹³ª«¥óÄݩʪº°µªk¬Û¦P®É¡A¤£¸Ó·P¨ì³Y²§¡C°ß¤@¤£¦Pªº¬O±z¨Ï¥ÎÄݩʵ{§Çªº²Ä¤TºØÃþ«¬¡AProperty Set µ{§Ç¡A¦Ó«D Property Let µ{§Ç¡C

Dim m_HomeAddress As CAddress      ' A module-level private variable.

Property Get HomeAddress() As CAddress
    Set HomeAddress = m_HomeAddress
End Property
Property Set HomeAddress(ByVal newValue As CAddress)
    Set m_HomeAddress = newValue
End Property

¦]¬°¥¿³B²zª«¥ó°Ñ·Ó¡A±z¥²¶·¦b³o¨â­Óµ{§Ç¤¤¨Ï¥Î Set ÃöÁä¦r¡C½T»{Caddressª«¥ó³Q«ü¬£µ¹ HomeAddress ÄݩʬO§_¦³®ÄªºÂ²³æ¤èªk¬O¥Î©Ò¦³»Ý¨DªºÄݩʨӸÕÅç¨ä Init ¤èªk¡C

Property Set HomeAddress(ByVal newValue As CAddress)
    With newValue
        .Init .Street, .City, .State, .Zip
    End With
    ' Do the assignment only if the above didn't raise an error.
    Set m_HomeAddress = newValue
End Property

¿ò¾Ñ¦a¡A«OÅ@ª«¥óÄݩʤ£±µ¨üµL®Äªº«ü¬£¤£¬O¨º»ò²³æ¡C­Y³Ì¤º³¡ªºÃþ§O-¦b¦¹¬° Caddress-µLªk¥H°·¥þªº¤èªk¨Ó«OÅ@¦Û¤v¡A¨º³Ì¥~¼hªºÃþ§O¤]«ÜÃø°µ¤°»ò¡C¬°¤F¸ÑÄÀ¬°¤°»ò¡A°lÂܳoÅãµM¤£¥¿½Tªº±Ô­z¡G

pers.HomeAddress.Street = ""  ' An invalid assignment raises no error.

­º¥ý¡A¹ï©ó¬Ý¨ì¥¼°õ¦æ Property Set HomeAddress µ{§Ç¥i¯à·P¨ìÅå³Y¡F¬Û¤Ï¦a¬O°õ¦æ Property Get HomeAddress µ{§Ç¡A¨ä¦ü¥G¨S¦³·N¸q¡A¦]¬°§Ú­Ì¬O«ü¬£­È¡A¦Ó«DŪ¨ú¥¦¡C¦ý­Y§Ú­Ì±q½sĶ¬Ýªk¨Ó¬Ý¦¹µ{¦¡½X¡A¨Æ±¡´NÅܦ¨¤£¤@¼Ë¤F¡C½sĶ¾¹±q¦¹¦æªº¥ªÃä±½¨ì¥kÃä¡G­º¥ýµo²{¨ìCPersonÃþ§OªºÄÝ©Ê°Ñ·Ó¡]´N¬Opers.HomeAddress¡^¡A¹Á¸Õ¥h¨M©w¥¦«ü¦V¤°»ò¦a¤è¡C°ò©ó¦¹¡A¥¦¥²¶·­pºâ¬Û¹ïªº Property Get µ{§Ç¡Cµ²ªG¬OµLªk¦³®Ä¦a¨Ï¥Î Property Get HomeAddress µ{¦¡¨Ó¨¾¤îCPersonÃþ§O¼Ò²Õ¦¨¬°µL®Ä¦ì§}¡G±z¥²¶·«OÅ@CAddress¨Ì¿à¦Û¤vªºÃþ§O¡C´N¬YºØ·N¸q¨Ó»¡¡A³o¬O¤½¥­ªº¡A¦]¬°¨C­ÓÃþ§OÀ³¸Ó¹ï¦Û¤v­t³d¡C

Åý§Ú­Ì¬Ý¬Ý¦p¦ó¨Ï¥ÎCadressÃþ§O§ïµ½CpersonÃþ§O¡C²{¦b¤w¸g¨Ï¥Î¤FHomeAddress ÄÝ©Ê¡A¦ý¬OÁÙ¦³¨ä¥L¥i¯àªºÀ³¥Î¡G

' In the declaration section of Cperson
Private m_WorkAddress As CAddress
Private m_VacationAddress As CAddress
' Corresponding Property Get/Set are omitted here....

±z¤w¬O¥Î³Ì¤Öªº¤O®ð¥i¥H¹F¨ì³\¦h¾÷¯à¡A¦ý³o¥u¬Oªí­±ªº¡C±z¤£¥u¬OÀ¸¼@©Ê¦a´î¤ÖCpersonÃþ§Oªº¤j¶qµ{¦¡½X¡]¥u»Ý­n¤T¹ï Property Get/Set µ{§Ç¡^¡A¤]²¤Æ¤F¥¦ªºµ²ºc¡A¦]¬°¨S¦³¤j¶q¥O¤H§x´bªº¬Û¦üÄݩʦWºÙ¡]HomeAddressStreet¡BWorkAddressStreeµ¥µ¥¡^¡C¦ý³Ì­«­n¡A±z¥u¦b¤@­Ó¦a¤è¨M©wCAddressªºÅÞ¿è¡A¦Ó¥¦·|¦bÀ³¥Î¨t²Î¨ä¥L¦a¤è·|¦Û°Ê­l¥Í¡A¦Ó¤£»Ý­n¹ï¨C­Ó¦a§}Äݩʪº¤£¦P«¬ºA³]©w¤£¦PªºÅçÃÒ³W«h¡C·í­n«ü¬£¦³®Äªº¦a§}®É¡A¬Ý¬ÝÅã¥Ü¨ä©Ò¦³¬O¦h»ò²³æªº¨Æ¡G

On Error Resume Next
' The error handler skips unassigned (Nothing) properties.
Print "Home: " &; pers.HomeAddress.CompleteAddress
Print "Work: " &; pers.WorkAddress.CompleteAddress
Print "Vacation: " &; pers.VacationAddress.CompleteAddress

VariantÄÝ©Ê
¡@

¶Ç¦^Variant­ÈªºÄÝ©Ê»P¨ä¥LÄݩʨèS¦³¤£¦P¡G¥u»Ý­n«Å§i¤@­Ó¤½¶}Variant¦¨­û´N§¹¦¨¤F¡C¦ý­YÄÝ©Ê¥i¥H±µ¦¬¥¿±`ªº­È©Îª«¥ó­È®É¡A¨Æ±¡´N¦³ÂI½ÆÂø¡CÁ|¨Ò¨Ó»¡¡A°²³]·Q­n¹ê§@ CurrentAddress ÄÝ©Ê¡A¦ý·Q­n«O«ù¦³¼u©Ê¡A¥B¯à°÷Àx¦sCaddressª«¥ó©Î²³æ¦r¦ê®É¡A¦p¤U©Ò¥Ü¡G

' The client code can assign a regular string
pers.CurrentAddress = "Grand Plaza Hotel, Rome"
' or a reference to another CAddress object (requires Set).
Set pers.CurrentAddress = pers.VacationAddress

Áö»¡¼u©Êªº±Æ§Ç¹ïÃþ§O¼W¥[³\¦h¤O¶q¡A¦ý¥¦¤]´î¤Ö¥¦ªº°·¥þ©Ê¡A¦]¬°µLªkªý¤îµ{¦¡³]­pªÌ¼W¥[«D¦r¦ê­È©Î¦³§O©óCAdressªºÃþ§Oª«¥ó¡C·Q­n±±¨î¤¤¹ê»Ú¤À¬£µ¹¦¹ÄݩʪºªF¦è¡A»Ý­n³z¹LÄݩʵ{§Ç½Õ°±©Ò¦³¹ï©ó¥¦ªº¦s¨ú¡C¦ý¦b¦¹±¡ªp¤U¡A»Ý­n¤T­Ó¤£¦PªºÄݩʵ{§Ç¡G

Private m_CurrentAddress As Variant

Property Get CurrentAddress() As Variant
    If IsObject(m_CurrentAddress) Then
        Set CurrentAddress = m_CurrentAddress   ' Return a CAddress object.
    Else
        CurrentAddress = m_CurrentAddress       ' Return a string.
    End If
End Property

Property Let CurrentAddress(ByVal newValue As Variant)
    m_CurrentAddress = newValue
End Property

Property Set CurrentAddress(ByVal newValue As Variant)
    Set m_CurrentAddress = newValue
End Property

·í¤@¯ë­È³Q¤À¬£µ¹ÄݩʮɡAProperty Let ÄÝ©Ê·|³Q¤Þµo¡A¦Ó·í¥Î¤áºÝ¥Î Set©R¥O«ü¬£ª«¥ó®É¡AProperty Set µ{§Ç·|°_§@¥Î¡C°O¦í¡AProperty Get µ{§Ç¦p¦ó¶Ç¦^­Èµ¹©I¥sµ{¦¡½X¡G¥¦¥²¶·´ú¸Õ¨p¦³ÅܼƬO§_¥Ø«e¥]§t¤@­Óª«¥ó¡AµM«á­Y¬Oª«¥óªº¸Ü¡A¥²¶·¨Ï¥Î Set ©R¥O¡CProperty Let ©M Set Åý±z±j¤Æ¦¨¬°§ó¦nªºÅçÃÒ¬[ºc¡G

Property Let CurrentAddress(ByVal newValue As Variant)
    ' Check that it is a string value.
    If VarType(newValue) <> vbString Then Err.Raise 5
    m_CurrentAddress = newValue
End Property

Property Set CurrentAddress(ByVal newValue As Variant)
    ' Check that it is a CAddress object.
    If TypeName(newValue) <> "CAddress" Then Err.Raise 5
    Set m_CurrentAddress = newValue
End Property

³o¸Ì¦³­Ó§Þ¥©Åý±z¸`¬Ù¤@¨Çµ{¦¡½X¨Ãµy·L§ï¶i°õ¦æ´Á¶¡ªº®Ä¯à¡C¦¹§Þ¥©¬O«Å§i©Ò´Á±æªºª«¥óÃþ§O¡A¦b Property Set µ{§Çªº°Ñ¼Æ¦C¤¤¡Aµ{¦¡½X¦p¤U¡G

Property Set CurrentAddress(ByVal newValue As CAddress)
    Set m_CurrentAddress = newValue
End Property

¨Ã¤£¯à¨Ï¥Î³o­Ó¤èªk¦b©Ò¦³±¡ªp¤U¡F¨Ò¦p¡A·í¥i±µ¨ü¨â­Ó©Î§ó¦h¤£¦P«¬ºAªºª«¥ó®É¡A¤£¯à¨Ï¥Î¥¦¡C¦b³o­Ó¨Ò¤l¤¤¡A¨Ï¥Î As Object °Ñ¼Æ¬O³Ì¦nªº¡G

Property Set CurrentAddress(ByVal newValue As Object)
    If TypeName(newValue) <> "CAddress" And TypeName(newValue) <> _
        "COtherType" Then Err.Raise 5
    Set m_CurrentAddress = newValue
End Property

¹ïVisual Basic¦Ó¨¥¡A¯u¥¿ªº«¬ºA¬O³Q«Å§i¦b Property Get µ{§Ç¤¤ªº­È©Ò¨M©w¡C¨Æ¹ê¤W¡A¨º¤]¬O¦bª«¥óÂsÄý¾¹Åã¥Üªº«¬ºA¡C

¦bBAS¼Ò²Õ¤¤ªºÄÝ©Ê
¡@

¤]¥i¥H¦b¼Ð·ÇªºBAS¼Ò²Õ¤¤«Ø¥ßÄݩʵ{§Ç¡A¤£¹LVisual Basic¤â¥U¤¤³o­Ó¨Æ¹ê¨Ã¨S¦³°O¸ü¡C³o­Ó¥\¯à¨Ï¤@¨Ç¤£¿ùªº§Þ¥©Åܦ¨¦³¥i¯à¹ê²{¡C¥i¥H¨Ï¥Î¤@¹ïÄݩʵ{§Ç¨Ó«Ê¸Ë¥þ°ìÅܼƥB½Õ°±¹ï¥þ°ìÅܼƩҦ³ªº¦s¨ú¡C©³¤U¬°¤@½d¨Ò¡G

' In a standard BAS module
Public Percent As Integer

¹ï©ó¹ê»Ú°·¥þªºµ{¦¡½X¦Ó¨¥¡A­n½T»{«ü¬£µ¹¥þ°ìÅܼƪº©Ò¦³­È¬O¦b0¨ì100ªº½d³ò¡A¦ý¬O¤£·Q¦bµ{¦¡½X¤¤´ú¸Õ©Ò¦³ªº«ü¬£±Ô­z¡C³o­Ó¸Ñ¨M¤èªk«Ü²³æ¡A¦b¤U¤@³¹¸`´N·|¤¶²Ð¡C

Dim m_Percent As Integer

Property Get Percent() As Integer
    Percent = m_Percent
End Property
Property Let Percent(newValue As Integer)
    If newValue < 0 Or newValue > 100 Then Err.Raise 5
    m_Percent = newValue
End Property

³o§Þ¥©¨ä¥L¦³½ìªºÅܤƬO°ßŪ©M¼g¤@¦¸¡þŪ¦h¦¸ªº¥þ°ìÅܼơC¤]¥i¥Î³o¤@§Þ¥©¨ÓÀ±¸ÉVisual Basicªº¤£¨¬¡A«Å§i¥]§t Chr$ ¨ç¼Æ»P³sÄò¹Bºâ¤¸ªº¦r¦ê±`¼Æ¡C

' You can't do this with a CONST directive.
Property Get DoubleCrLf() As String
    DoubleCrLf = vbCrLf &; vbCrLf
End Property

³Ì«á¡A¦bBAS¼Ò²Õ¥i¥H¨Ï¥ÎPropertyµ{§Ç¨Ó°lÂܦbµ{¦¡½X¤¤¥þ°ìÅܼƷ|µo¥Í¤°»ò¨Æ¡C°²³]µ{¦¡¤£¥¿½T¦a«ü¬£¿ù»~­Èµ¹¥þ°ìÅܼơA¦Ó±z·Q­nÁA¸Ñ³o¬O¦ó®Éµo¥Íªº¡C¥u­n¥Î¤@¹ïPropertyµ{§Ç´À¥NÅܼơA¥[¤W Debug.Print ±Ô­z¡]©Î¿é¥X¦ÜÀɮס^¡C·í­×¥¿©Ò¦³°ÝÃD«á¡A§R°£³oµ{§Ç¨Ã¥BÁ٭즨­ì¥»ªº¥þ°ìÅܼơCÃö©ó¦¹³Ì¦nªº¬O¤£»Ý­n¦bÀ³¥Î¨t²Î¤¤½s¿è³æ¤@¦æªºµ{¦¡½X¡C

CallByName¨ç¼Æ
¡@

Visual Basic 6ªºVBA»y¨¥¥]§t¤@­Ó¨üÅwªïªºªþ¥[¥\¯à¡A¦¹¥H CallByName ¨ç¼Æªº§Î¦¡¦s¦b¡C³o¤@ÃöÁä¦r¥i°Ñ·Ó¤@­Óª«¥óªº¤èªk©ÎÄÝ©Ê¡AÂǥѦb°Ñ¼Æ¤¤¶Ç»¼ª«¥óªº¦WºÙ¡A»yªk¦p¤U¡G

result = CallByName(object, procname, calltype [,arguments..])

¨ä¤¤ Procname ¬OÄݩʩΤèªkªº¦WºÙ¡A¦Ó calltype ­È¦p¤U¡G1-vbMethod¡B2-vbGet¡B4-vbLet¡B8-vbSet¡C±z¥²¶·¶Ç»¼¤èªk©Ò´Á«Ýªº¥ô¦ó°Ñ¼Æ¡A¥BÀ³¸ÓÁקKÂ^¨ú¶Ç¦^­È¡A­Y¤Þ¤JSub¤èªk©Î Property Let/Get µ{§Ç®É¡C³o¸Ì¦³­Ó¨Ò¤l¡G

Dim pers As New Cperson
' Assign a property.
CallByName pers, "FirstName", vbLet, "Robert"
' Read it back.
Print "Name is " &; CallByName(pers, "FirstName", vbGet)
' Invoke a function method with one argument.
width = CallByName(Form1, "TextWidth", vbMethod, "ABC")

³o¸Ì¦³¨Ç¦³Ãö¦¹¨ç¼Æ­È±oª`·Nªº¸ê°T¡A¨âªÌ¬Ò¼vÅT¨ç¼Æªº¥i¥Î©Ê¡G

´N¤@¯ë³W«h¨Ó»¡¡A·í¨Ï¥Î¥¿³Wªº¡§ . ¡¨»yªk¥i¥H¹F¨ì¬Û¦P®ÄªG®É¡AÀ³¸Ó¤£­n¨Ï¥Î CallByName ¨ç¼Æ¡CµM¦Ó¡A·í³o¨ç¼Æ¤¹³\±z¼¶¼g²¼ä©M°ª«×°Ñ¼Æªºµ{¦¡½X®ÉÁÙ¬O¥i¥Îªº¡C¤@­Ó¦³½ìªºÀ³¥Îµ{¦¡¦h¯à¦bªí³æ¤¤§Ö³t³]©w±±¨î¶µªº³\¦hÄÝ©Ê¡C·í­nÅý¨Ï¥ÎªÌ¦³¯à¤O¨Ó­q°µªí³æ¡AµM«á¦b Form_Load ¨Æ¥ó¤¤»Ý­nÁÙ­ì³Ì«áªº°t¸m®É¡A³o¥i¯à¬O¦³¥Îªº¡C§Ú·Ç³Æ¨â­Ó°µ¦¹¤u§@ªº¥i¦A§Q¥Îªºµ{§Ç¡G

' Returns an array of "Name=Values" strings 
' Supports only nonobject properties, without indices
Function GetProperties(obj As Object, ParamArray props() As Variant) _
    As String()
    Dim i As Integer, result() As String
    On Error Resume Next
    ' Prepare the result array.
    ReDim result(LBound(props) To UBound(props)) As String
    ' Retrieve all properties in turn.
    For i = LBound(props) To UBound(props)
        result(i) = vbNullChar
        ' If the call fails, this item is skipped.
        result(i) = props(i) &; "=" &; CallByName(obj, props(i), vbGet)
    Next
    ' Filter out invalid lines.
    GetProperties = Filter(result(), vbNullChar, False)
End Function

' Assign a group of properties in one operation.
' Expects an array in the format returned by GetProperties
Sub SetProperties(obj As Object, props() As String)
    Dim i As Integer, temp() As String
    For i = LBound(props) To UBound(props)
        ' Get the Name-Value components.
        temp() = Split(props(i), "=")
        ' Assign the property.
        CallByName obj, temp(0), vbLet, temp(1)
    Next
End Sub

·í¨Ï¥ÎGetProperties®É¡A¥²¶·´£¨Ñ¤@¦ê±z©Ò·P¿³½ìªºÄÝ©Ê¡A¦ý·í¥ÎSetProperties©I¥s«ì´_Äݩʮɫh¤£»Ý­n¦¹¦Cªí¡C

Dim saveprops() As String
saveprops() = GetProperties(txtEditor, "Text", "ForeColor", "BackColor")
...
SetProperties txtEditor, saveprops()

¯S©Ê
¡@

³z¹Lµ{¦¡½Xµøµ¡¨ÃµLªk§¹¥þ¦a©w¸q¤@­ÓÃþ§O¡C¨Æ¹ê¤W¡A±z¥²¶·¥Î¤@ºØ¤£¦Pªº¤è¦¡¸Ô²Ó»¡©ú¤@¨Ç­«­nªº¯S©Ê¡C³o¨Ç¯S©Ê¥i¯à»PÃþ§O¼Ò²Õªº¥þ³¡©Î­Ó§O¦¨­û¦³Ãö¡]¥ç§Y¨äÄÝ©Ê©M¤èªk¡^¡C

Ãþ§O¼Ò²Õ¯S©Ê
¡@

Æ[©À¤W¡AÃþ§O¼Ò²Õ¥»¨­ªº¯S©Ê¬O³æ¯Âªº¡A¦]¬°¥i¥H³z¹LÄݩʵøµ¡¨Ó½s¿è¥L­Ì¡A´N¹³¦bVisual BasicÀô¹Ò¤¤ªº¨ä¥L­ì©lµ{¦¡½X¼Ò²Õ¯ë¡C¦ý»Pªí³æ©M¼Ð·Ç¼Ò²Õ¬Û¤ñ¡A·í«ö¤UF4Áä«á¡A¨Ì¾Ú±M®×Ãþ«¬ªº¤£¦P¡AÄݩʵøµ¡©Ò¬Ý¨ìªº¤]¤£¤@¼Ë¡]°Ñ¦Ò¹Ï6-5¡^¡C³o¸Ì¦³¤»­Ó¯S©Ê¡GName¡BDataBindingBehavior¡BDataSourceBehavior¡BInstancing¡BMTSTransactionMode ¥H¤Î Persistable¡C¦b¤§«áªº³¹¸`·|¨Ì§Ç´£¨ì¡C


¡@

¹Ï6-5 ¥u¦³¦bActiveX DLL±M®×ªº¤½¶}Ãþ§O¼Ò²Õ¤~·|¦bÄݩʵøµ¡¤¤Åã¥Ü©Ò¦³¥i¯àªºÃþ§O¯S©Ê¡C

Ãþ§Oªº¹w³]¦¨­û
¡@

¤j¦h¼ÆVisual Basic±±¨î¶µ©M¤º«Øª«¥ó³£¦³­Ó¹w³]ªºÄݩʩΤèªk¡CÁ|¨Ò¨Ó»¡¡ATextBox±±¨î¶µªº¹w³]ÄݩʬO Text¡FErrorª«¥óªº¹w³]ÄݩʬO Number¡ACollections¦³­Ó¹w³]ªº Item ¤èªkµ¥µ¥¡C³o¨Ç¶µ¥ØºÙ¬°¹w³]¦¨­û¡A¦]¬°­Y¦bªí¥Ü¦¡¤¤¬Ù²¤¥L­Ìªº¸Ü¡AVisual Basic·|°²³]«ü¦V¯S©wªº¦¨­û¡CÂǥѥH¤Uµ{§Ç¡A¥i¥H¦b±zªºÃþ§O¤¤¹ê§@¬Û¦Pªº¾÷¨î¡G

  1. ¦bµ{¦¡½s¿è°ÏªºÄݩʩΤèªk©w¸q¤WÂI¿ï¤@¤U¡A±q¤u¨ã¦C¤¤°õ¦æProcedure Attributes©R¥O¡AµM«á­Y¶µ¥Ø¨S¦³Åã¥Ü¡A«h±q³Ì¤WºÝªº¤U©Ô¦¡¿ï³æ¤¤¿ï¾Ü¶µ¥Øªº¦WºÙ¡C
  2. «ö¤UF2¶}±Òª«¥óÂsÄý¾¹¡A¦b³Ì¥ª°¼ªº­±ªO¿ï¾ÜÃþ§O¼Ò²Õ¦WºÙ¡F©Î¦b³Ì¥kÃä­±ªO¡A¦b­n¦¨¬°¹w³]¦¨­ûªº¶µ¥Ø¤W«ö¤@¤U¥kÁä¡AµM«á±qPop-up¿ï³æ¤¤¿ï¾ÜÄݩʿﶵ¡A¦p¹Ï6-6¡C

    ¡@

    ¹Ï6-6 ±qª«¥óÂsÄý¾¹¿ï¾ÜÄݩʿﶵ
  3. ¥u­n¹ï©ó·P¿³½ìªº¿ï¶µ¦¨¬°Name¤U©Ô¦¡¿ï³æ³Ì¤WºÝªºµJÂI¡A«ö¤UAdvance«ö¶s®i¶}Procedure Attributes¹ï¸Ü¤è¶ô¡]¦p¹Ï6-7¡^¡C

    ¡@

    ¹Ï6-7 ®i¶}ªºProcedure Attributes¹ï¸Ü®Ø
  4. ¦bProcedure ID¤U©Ô¦¡¿ï³æ¤¤¡A¿ï¾Ü¡]¹w³]¡^¿ï¶µ¡F¤]¥i¦b¤U©Ô¦¡½s¿è°Ï¤¤¥u¥´¤J0¡C
  5. «ö¤U½T©w«ö¶s¡AµM«áÃö³¬¹ï¸Ü¤è¶ô¡C¦bª«¥óÂsÄý¾¹¤¤¡A±z·|ª`·N¨ì¤@­Ó¤p«¬¶êªº«ü¥Üª«ºò¾F¦b¦¨­û¦WºÙ®Ç¡C³oªí¥Ü¥L¤w¸gÅܦ¨Ãþ§Oªº¹w³]¦¨­û¡C

¤@­ÓÃþ§O¤£¯à¦³¦h­Ó¹w³]ÄݩʩΤèªk¡C­Y¹Á¸Õ«Ø¥ß²Ä¤G­Ó¹w³]­È¡AVisual Basic·|©ê«è¨Ã·|½T»{±zªº¨M©w¡C¤@¯ë¦Ó¨¥¡A§ïÅÜÃþ§Oªº¹w³]¦¨­û¨Ã«D¦n¥D·N¡A¦]¬°³o­×¥¿¥i¯à¯}Ãa¥ý«e©Ò¼gªº©Ò¦³¥Î¤áºÝµ{¦¡½X¡C

µ§ªÌ¬Û·í¦P·N´£¨Ñ¹w³]Äݩʵ¹Ãþ§O¼Ò²Õ·|Åý¥¦§ó²³æ¨Ï¥Î¡A§Ú·Q­nĵ¥Ü±z¨Ï¥Î¦¹¯S©Ê¾É­P¬Y¨Ç¥i¯àªº°ÝÃD¡C¦^¨ìCpersonÃþ§O»P¥Lªº HomeAddress ¤Î WorkAddress ÄÝ©Ê¡C¦p±z©Òª¾¹Dªº¡A¥i¥H«ü¬£¤@­Óª«¥óÄݩʵ¹¥t¤@­Ó¡G

Set pers.HomeAddress = New Caddress
Set pers.WorkAddress = New CAddress
pers.HomeAddress.Street = "2233 Ocean St."
...
Set pers.WorkAddress = pers.HomeAddress   ' This person works at home.

¥Ñ©ó¦¹µ{¦¡½X¨Ï¥Î Set ©R¥O¡A¨âªÌªºÄݩʹê»Ú¤W¥¿«ü¦V¬Û¦PªºCAdressª«¥ó¡C³o«Ü­«­n¡A¦]¬°³o·t«ü¨S¦³°t¸mÃB¥~ªº°O¾ÐÅé¨ÓÀx¦s­«½Æªº¸ê®Æ¡A¥B¤]¦]¬°±z¥i¥H¦Û¥Ñ¦a³z¹L¨â­ÓCpersonÄݩʪº¨ä¤¤¤@­Ó¨Ó­×¥¿AddressÄÝ©Ê¡A¦Ó¤£·|µo¥Í¤£¤@­P¡G

pers.HomeAddress.Street = "9876 American Ave"
Print pers.WorkAddress.Street   ' Correctly displays "9876 American Ave"

­Y¿ù»~ªº¬Ù²¤ Set ÃöÁä¦r¡A¬Ý¬Ý·|µo¥Í¤°»ò¨Æ¡G

pers.WorkAddress = pers.HomeAddress   ' Error 438 "Object doesn't support
                                      ' this property or method"

§O³Q¿ù»~°T®§©ÒÅåÀ~¡G¦b±zªºµ{¦¡½X¤¤¦³­ÓÅÞ¿è¿ù»~¡A°õ¦æ®ÉVisual Basic·|«ü¥X¥¦¡A³o¬O¥ó¦n¨Æ¡C­YÃþ§O¦³­Ó¹w³]ÄÝ©Ê¡A³o­Ó¦³¥Îªº¿ù»~±N®ø¥¢¡C·Q¬Ý¬Ý«ç»ò¦^¨Æ¶Ü¡HÅý Street ¦¨¬°Ãþ§Oªº¹w³]¶µ¥Ø¡AµM«á°õ¦æ¥H¤Uµ{¦¡½X¡G

Set pers.HomeAddress = New Caddress
Set pers.WorkAddress = New CAddress
pers.HomeAddress.Street = "2233 Ocean St."
pers.WorkAddress = pers.HomeAddress   ' No error! But has it worked?

³o®É¨S¦³¿ù»~µo¥Í¡A¬Ý¬Ý²{¦b³o¨â­ÓÄݩʦp¦óÃö³s¡G

'Change the Street property of one object.
pers.HomeAddress.Street = "9876 American Ave"
Print pers.WorkAddress.Street        ' Still displays "2233 Ocean St."

´«¨¥¤§¡A³o¨â­ÓÄݩʤ£¦A«ü¦V¬Û¦Pªºª«¥ó¡C¨S¦³ Set ©R¥Oªº«ü¬£´ÛÄF¤F½sĶ¾¹¡Õ¨Ï¤§¥H¬°§Ú­Ì¬O­n«ü©w Street ¹w³]Äݩʪº­È¡]³o¬O¤@­Ó¦Xªkªº°Ê§@¡^¡A¦Ó¨Ã¨S¦³­n«Ø¥ß¬Û¦Pª«¥ó·sªº°Ñ·Ó¡C

²µuªº»¡¡A¥[¤J¹w³]ÄÝ©Ê«á¡A±z·|©¿²¤±¼¦³Ãöµ{¦¡½X¥¿·í©Êªº­«­n´£¥Ü¡Cµ§ªÌ­Ó¤Hªº¸gÅç¬O©¿²¤ Set ©R¥O¬O­ÓÃø¥H®»ºNªºBug¡A¥B«ÜÃøÀˬd¨ì¡C·í¨M©w«Ø¥ß¹w³]ÄݩʮɡA¤d¸U­n°O±o³o¥ó¨Æ¡C¥B­Y¨M©w«Ø¥ß¥L­Ì¡AÁ`­n¦A¦¸Àˬdµ{¦¡½X¤¤ªº Set ÃöÁä¦r¡C


ª`·N

±z¥i¯àª`·N¨ì­Y¦b¤@«ü©w¦¡¤¤¡A¥ªÃ䪺ª«¥óÄݩʬ°Nothing®É¡AVisual Basic·|²£¥Í¿ù»~¸¹½X91¡A§Y®É§Ú­Ì¬Ù²¤SetÃöÁä¦r¡CµM¦Ó³o¤£·|µo¥Í¡A­Y¥Ø¼ÐÄݩʤw¸g³Q«Å§i¬°¤@­Óauto-instancing¡A¦]¬°¦p¦¹Visual Basic·|«Ø¥ß¤@­Óª«¥ó¡C³o¶È¬O¶i¤@¨BªºÃÒ©ú¡Aauto-instancingª«¥óÀ³¸ÓÁ`¬O­n³QÃhºÃªº¡C


¦³¥Îªº½d¨Ò
¡@

Áö»¡¤wĵ§i±z¨Ï¥Î¹w³]ÄÝ©Ê¡A¦ý²{¦bµ§ªÌ­n®i¥Ü¤@­Ó¨Ò¤l¨ÓÃÒ©ú¥L­Ì¬O«D±`¦³¥Îªº¡C¦ý¬O­º¥ýµ§ªÌ»Ý­n¤¶²Ð sparse matrices ·§©À¡C¤@­Óµ}¤Ö°}¦C¡]Sparse matrices¡^¬O¤@­Ó¤jªº¤Gºû¡]©ÎªÌ¬O¦hºûªº¡^°}¦C¡A¥]¬A¬Û¹ï¦a¤Ö¼Æªº«D¹s¶µ¥Ø¡C¤@­Ó¥u¦³500«D¹s¶µ¥Øªº1000X1000°}¦C¥i¥H¬Oµ}¤Ö°}¦Cªºµ´¨Î¨Ò¤l¡Cµ}¤Ö°}¦C¦b¼Æ¾Ç©M¥N¼Æ¤W¨Ã¤£±`¥Î¨ì¡A¦ý¦b°Ó·~À³¥Î¨t²Î¤W¦³­Ó¥Î³~¡C¨Ò¦p¡A±z¥i¯à¦³­Ó1000­Ó«°¥«ªº¦Cªí¡A¥B¦³¤@­Ó¤Gºû°}¦C¨ÓÀx¦s¥ô¨â­Ó«°¥«ªº¶ZÂ÷¡C°²³]§Ú­Ì¨Ï¥Î0¡]©Î¬Y¨Ç¨ä¥L¯S®í­È¡^¨Óªí¥Ü¨S¦³ª½±µ³s±µªº«°¥«¶ZÂ÷¡C¤jªºµ}¤Ö°}¦C·|¤ÞµoÄY­«ªº°O¾ÐÅé­t²ü°ÝÃD¡G¤@­Ó¦³1000¦C©M1000¦æ¡]¥]§tSingle©ÎLong­È¡^ªº¤Gºû°}¦C»Ý­n±Nªñ4MB¡A©Ò¥H±z¥i¥H¹w´Á¨ì¥¦±N·|©úÅã¦a¨ÏÀ³¥Îµ{¦¡ÅܺC¡C

¹ï¦¹°ÝÃD²³æªº¸Ñ¨M¤èªk¬O¥uÀx¦s«D¹sªº¤¸¯À¡A³s¦P´Á¦æ¦Cµù¼Ð¡C¹ï¨C­Ó¤¸¯À¡A»Ý­n8­ÓÃB¥~ªº¦ì¤¸²Õ¡A¦ý³Ì«á±N·|¸`¬Ù¤@°ï°O¾ÐÅé¡C¨Ò¦p¡A­Y¥u¦³10,000¶µ¥Ø¬°«D¹s¡]¶ñº¡²v¬°1:100¡^¡A±zªºµ}¤Ö°}¦C±N¥u»Ý­n¤p©ó120KB¡Ð³o¤j·§¤ñ­ì¥»ªº°}¦C¤p33­¿-©Ò¥H¬Ý¨Ó¬O­Ó¥i¯àªº¸Ñªk¡C±z¥i¥H·|¥H¬°¦bVisual Basic¹ê§@µ}¤Ö°}¦C»Ý­n¬Û·í¦hªºµ{¦¡½X¡A©Ò¥H·í¨Ï¥ÎÃþ§O¼Ò²Õ®É¡A±z·|Åå³Y¥¦³º¬O¦p¦¹Â²³æ¡G

' The complete source code of the CSparseArray class
Private m_Value As New Collection

Property Get Value(row As Long, col As Long) As Single
    ' Returns an item, or 0 if it doesn't exist.
    On Error Resume Next
    Value = m_Value(GetKey(row, col))
End Property

Property Let Value(row As Long, col As Long, newValue As Single)
    Dim key As String
    key = GetKey(row, col)
    ' First destroy the value if it's in the collection.
    On Error Resume Next
    m_Value.Remove key
    ' Then add the new value, but only if it's not 0.
    If newValue <> 0 Then m_Value.Add newValue, key
End Property

' A private function that builds the key for the private collection.
Private Function GetKey(row As Long, col As Long) As String
    GetKey = row &; "," &; col
End Function

½T«O Value ÄݩʡЦ¹Ãþ§Oªº°ß¤@¤½¶}¦¨­û¡Ð¤]¬O¥¦ªº¹w³]ÄÝ©Ê¡AÀ¸¼@©Ê¦a²¤Æ¥Î¤áºÝ¨Ï¥ÎªÌ¦p¦ó¨Ï¥Î¦¹Ãþ§O¡C¬Ý¬Ý¨Ï¥Î¥þ·sªº¡B¸ê·½¯à¤O¸ê®Æµ²ºc¨Ó¥N´À¥¿³W°}¦C¬O¦h²³æªº¨Æ¡G

Dim mat As New CSparseArray 
' The rest of the application that uses the matrix isn't unchanged.
mat(1, 1) = 123             ' Actually using mat's Value property!

´«¨¥¤§¡A©¯Á«¹w³]ÄÝ©Ê¡AÂǥѥu§ïÅܥΤáºÝµ{¦¡½Xªº¤@¦æ±Ô­z¥i¥H§ïÅÜÀ³¥Î¨t²Îªº¤º³¡¹B§@¡]³o¬O³Q´Á±æ¡A¦P®É¤]¬O³Ì¨Î¤Æªº¡^¡C³oÀ³¬O¹ï©óÃÙ¦P¹w³]ÄÝ©Ê¥O¤H«HªAªº¨¥½×¤F¡C

¹ê»Ú¤W¡ACsparseArrayÃþ§O¤ñ¥¦©ÒÅã¥Üªº§ó±j¡C¨Æ¹ê¤W¡A¨ä­ì¥»ªº¹ê§@¬O¨Ï¥ÎLong«¬ºA¨Óªí¥Ü¨ä row¡Bcol °Ñ¼Æ¡A¥B¶Ç¦^­È¬°Single«¬ºA¡A±z¥i¯à¨Ï¥ÎVariant«¬ºA¨Óªí¥Ü³o¨â­Óµù¼Ð»P¨ä¶Ç¦^­È¡C²Ä¤@­Ó­×¤¹³\±z«Ø¥ß¨Ï¥Î¦r¦ê§@¬°µù¼Ðªº°}¦C¡A¦p¤U¦Cµ{¦¡¡G

' The distance between cities
Dim Distance As New CSparseArray
Distance("Los Angeles", "San Bernardino") = 60

¨Ï¥ÎVariant¶Ç¦^«¬ºA¤£·|¤ñ¤§«eªº®ö¶O¤Ó¦hªº°O¾ÐÅé¡A¦]¬°¤º³¡ªº m_Values¶°¦XµL½×¦p¦ó¬Ò¹ï¨C­Ó­È°t¸m¤@­ÓVariant¡C

¦b¥»¸`µ²§ô«e¡A´£¥Ü¥t¤@­Ó¯S§Oªº°}¦C«¬ºA¡AºÙ¬°¹ïºÙ°}¦C¡]symmetrical array¡^¡C¦¹«¬ºA¬O¤Gºû°}¦C¡Am(i,j) Á`¬Oµ¥©ó m(j,i) ¡A©Ò¥H­È¥i¥H¥uÀx¦s¤@¦¸¨Ó¸`¬Ù°O¾ÐÅé¡CDistance °}¦C¬O­Ó¤£¿ùªº¹ïºÙ°}¦C¨Ò¤l¡A¦]¬°¨â­Ó«°¥«ªº¶ZÂ÷¸ò«°¥«ªº¶¶§ÇµLÃö¡C·í¥Î¥¿³WªºVisual Basic°}¦C³B²z®É¡A°O±o¥¦ªº¹ïºÙ©Ê¡A¥B¦]¦¹¥²¶·Àx¦s¨â¦¸¬Û¦Pªº­È¡A³oªí¥Ü»Ý­n§ó¦hªºµ{¦¡¡B°O¾ÐÅé©M¾É­P¿ù»~ªº¾÷·|¡C©¯¦n¡A²{¦b¥i¥H±N©Ò¦³¨Æ±¡«Ê¸Ë¶iÃþ§O¼Ò²Õ¤º¡A¥u»Ý­n½s¿è¤@­Ó¨p¦³µ{§Ç¡G

' Note that row and col are now Variants.
Private Function GetKey(row As Variant, col As Variant) As String
    ' Start with the lesser of the two--a case-insensitive comparison
    ' is needed because collections search their keys in this way.
    If StrComp(row, col, vbTextCompare) < 0 Then
        ' Using a nonprintable delimiter is preferable.
        GetKey = row &; vbCr &; col
    Else
        GetKey = col &; vbCr &; row
    End If
End Function

³o¼Ë´N°÷Åý¨Ï¥Î¤áºÝµ{¦¡½X¦p¹w´Á¯ë¹B§@¡G

Dim Distance As New CsparseMatrix
Distance("Los Angeles", "San Bernardino") = 60
Print Distance("San Bernardino", "Los Angeles")   ' Displays "60"

¨ä¥L¯S©Ê
¡@

±z¥i¯àª`·N¨ì¦b ¹Ï6-7  Procedure Attributes ¹ï¸Ü¤è¶ôÁÙ¥]§t³\¦h¨ì¥Ø«e¬°¤î¥¼´£¤ÎªºÄæ¦ì¡C¤j¦h¼ÆªºÄݩʳ£¬O¶i¶¥ªº¡A¦b¥»³¹¤¤µLªk³Æ¤Î¡A¦ý¦³¤T­Ó­È±oÃB¥~¸ÑÄÀªº¡C

 Description ¥i¥H¥Î¤å¦r¨Ó´y­z©w¸q¦bÃþ§O¼Ò²ÕªºÄÝ©Ê©M¤èªk¡CµM«á³o´y­z·|¥X²{¦bª«¥óÂsÄý¾¹¡A¨Ã´£¨ÑÃþ§O¼Ò²Õªº¨Ï¥ÎªÌ¦³Ãö¨C­Ó¦¨­û¦p¦ó¨Ï¥Î¡C´y­z¤å¦r¬O¥iµøªº¡A§Y¨Ï·íÃþ§O½sĶ¦¨COM¤¸¥ó®É¥çµM¡A¥H«KÅý¨ä¥Lµ{¦¡³]­pªÌ¥i±q¥~³¡¨ÓÂsÄý¨ä¤¶­±¡C

 HelpContextID ±z¥i¥H´£¨Ñ¤@­Ó»¡©úÀÉ¡A¤º®e¬°¹ï¦b±M®×¤ºªº©Ò¦³Ãþ§O¡BÄÝ©Ê¡B¤èªk¡B¨Æ¥óµ¥µ¥ªº´y­z¡C­Õ­Y¦p¦¹°µªº¸Ü¡A¤]À³¸Ó«ü©w¤@­Ó¯S©wªºIDµ¹±M®×¤¤ªº¨C­Ó¶µ¥Ø¡C·íª«¥óÂsÄý¾¹³Ì¥kÃ䪺¶µ¥Ø³Q¿ï¨ú®É¡A«ö¤U¡H«ö¶s·|¦Û°Ê±a±z¨ì¬Û¹ïªº»¡©ú­¶­±¡C»¡©úÀɪº¦WºÙ¥i¥H¦b±M®×Äݩʹï¸Ü®Ø¤¤¿é¤J¡C

 Hide This Member ­Y¿ï¾Ü¦¹¤@¿ï¶µ¡A·íÃþ§O±q±M®×¥~³¡³QÂsÄý®É¡AÃþ§O¼Ò²Õ¤ºªºÄݩʩΤèªk¦bª«¥óÂsÄý¾¹¤¤¬O¬Ý¤£¨ìªº¡C¦¹³]©w¦b¥Ø«e±M®×¤¤¨Ã¨S¦³®ÄªG¡A¥B¥u¦b°£¼Ð·ÇEXE±M®×¥~ªº¨ä¥L±M®×«¬ºA¤~¦³·N¸q¡C°O¦í¡G¡u ÁôÂáv¤@­Ó¶µ¥Ø¤£ªí¥Ü¹ï¨ä¥Lµ{¦¡³]­pªÌµ´¹ïµLªk¬Ý¨ì¡C¹ê»Ú¤W¡A¬Æ¦Ü¦bVisual Basic¤ºªºÂ²³æª«¥óÂsÄý¾¹¤]¥]¬A¤@­Ó¡uÅã¥ÜÁôÂ樭û¡v¿ï¶µ¡]¦p¹Ï6-6¡^¡CÁôÂõ¹©w¶µ¥Øªº¨M©wÀ³¸Ó¥u¬O¹ï±zÃþ§O¨Ï¥ÎªÌªº«Øij¡A·N«äÃþ¦ü¡u¤£­n¨Ï¥Î¦¹¶µ¥Ø¡A¦]¬°¥L¨S¦³³Q¤ä´©¡A¥B¦b²£«~¥¼¨Óªºª©¥»¥i¯à¤£·|¥X²{¡C¡v¡C


ª`·N

©Ò¦³ªºÃþ§OÄÝ©Ê-¥]¬A¦b¥»¸`¤¤´£¤Îªº¤Î¨ä¥L³¹¸`­n´£ªº-¬Ò¥¼Àx¦s¦b­ì©lµ{¦¡½X¤º¡A©Ò¥H·í±z­n½Æ»s¨ä©Ò³sµ²ªºµ{¦¡½X®É¡A¥L­Ì¨Ã¥¼¦b¤£¦PªºÃþ§O¼Ò²Õ¶¡³Q½Æ»s©M¶K¤W¡C§óÁVªº¬O¡A·í±z¨Ï¥Î°Å¤U¶K¤W°Ê§@¨Ó­«·s¦w±Æ¦b¬Û¦PÃþ§O¼Ò²Õ¤ºªº¤èªk©MÄݩʪº¶¶§Ç®É¡A¥L­Ì¬Æ¦ÜµLªk«O¦s¡C­Y±z·Q­n¦bÃþ§O¼Ò²Õ¤¤²¾°Êµ{¦¡½X¦Ó¤£¿ò¥¢©Ò¦³Áô©Ê³s±µªºÄݩʮɡA­º¥ý¥²¶·½Æ»s·Q­n©ñ¸mªºµ{¦¡½X¡AµM«á±q­ì¨Óªº¦ì¸m§R°£¥¦¡C·í­«·s©R¦WÄݩʩΤèªk®É³o´N¤£¦bijÃD¤º¤F¡C



¤p¯µ³Z

©_©Ç¦a¡AVisual Basic¤å¥ó¨Ã¨S¦³´£¤ÎÃþ§O¼Ò²Õ¤]¤ä´©¥¦¦Û¤vªºDescriptionHelp ©M HelpContenID ¯S©Ê¡A¦]¦¹¨S¦³¸ÑÄÀ¦p¦ó­×§ï¥L­Ì¡C³o§Þ¥©¬O²³æªº¡G¦bª«¥óÂsÄý¾¹³Ì¥ªÃ䪺­±ªO¥H·Æ¹«¥kÁä«ö¤UÃþ§O¦WºÙ¡A¨Ã±qpop-up¿ï³æ¤¤¿ï¾ÜProperties©R¥O¡C


ª«¥óªº¤º³¡¹B§@
¡@

²{¦b±z¹ï©ó¦p¦ó¼¶¼g»P²Õ´Ãþ§O¼Ò²Õ¥H¤ÎÄݩʸò¤èªk¦p¦ó¹B§@¦³¤@­Ó¨ãÅ骺¤F¸Ñ¡A¾Ç²ß§ó¦h¦³Ãö¦bVisual Basic¤¤ª«¥ó¬O»Ý­n®É¶¡ªº¡C

ª«¥óÅܼƹê»Ú¤W¬O¤°»ò
¡@

³o¬Ý°_¨Ó¦ü¥G¬O·MÄøªº°ÝÃD¡A¦ý«o¤£¬Oªº¡C²Ä¤@­Ó¦^µª¬O¡Gª«¥óÅܼƬO­Ó«ù¦³ª«¥ó¸ê®Æªº°O¾ÐÅé°Ï°ì¡C¦¹©w¸q©úÅã¦a°_·½©ó¹ïUDT¬[ºc¡]¤]«ù¦³²Õ¦X¸ê®Æ¡^ª«¥óªº¬Û¦ü¡A¦ý¿ò¾Ñ¦a§¹¥þ¿ù»~¡C¨Æ¹ê¬O­Y«Ø¥ß¨â­Ó«ü¦V¬Û¦Pª«¥óªºª«¥óÅܼơA³o¬O¨â­Ó¤£¦Pªº·§©À¡A¨Ò¦p¡G

Dim p1 As New CPerson, p2 As Cperson
p1.CompleteName = "John Smith"
Set p2 = p1
' Both variables now point to the same object.
Print p2.CompleteName          ' Displays "John Smith" as expected.
' Change the property using the first variable.
p1.CompleteName = "Robert Smith"
Print p2.CompleteName          ' 2nd variable gets the new value!

­Yª«¥ó©MUDT¦æ¬°Á|¤î¬Û¦Pªº¸Ü¡A³Ì«á¤@¬q±Ô­z¤´µM¶Ç¦^P2ªº­ì©l­È¡]"John Smith"¡^¡A¦ý­Ë¼Æ²Ä¤G¦æµ¹P1ªº«ü©w¤]¼vÅT¨ä¥¦ÅܼơC¦¹¦æ¬°ªº²z¥Ñ¬Oª«¥óÅܼƬO¹ê»Ú«ü¦Vª«¥ó¸ê®Æ³QÀx¦sªº°O¾ÐÅé°Ï°ìªº«ü¼Ð¡C³o¬O¤@­Ó§ó¥O¤HÃöª`ªº¡B¦³ÂI³Y²§ªº­«­n·§©À¡C

  • ¨C­Óª«¥óÅܼÆÁ`¬O®ö¶O4¦ì¤¸²Õªº°O¾ÐÅé¡A¦]¬°¥L¥u¤£¹L¬O«ü¦V°O¾ÐÅé¦ì§}ªº«ü¼Ð¡A¤£ºÞª«¥óªº¤j¤p©M½ÆÂø«×¡C
    ¡@
  • ·í¨Ï¥Î Set ÃöÁä¦r¨Ó«ü¬£ª«¥óÅܼƵ¹¥t¤@­Ó®É¡A¹ê»Ú¤W¬O«ü¬£µ¹32¦ì¤¸ªº°O¾ÐÅé¦ì§}¡C¨S¦³½Æ»sª«¥ó¤ºªº¸ê®Æ¡A¥B¨S¦³ÃB¥~ªº°O¾ÐÅé³Q»Ý­n¡A¦]¦¹¨Ï±oª«¥ó¤À¬£¦¨¬°§Ö³tªº°Ê§@¡C
    ¡@
  • ·í¨â­Ó©Î§ó¦hªºª«¥óÅܼƫü¦V¬Û¦Pªºª«¥ó¹êÅé¡A±z¥i¥H¨Ï¥Î¥ô¤@ÅܼƨӳB²zª«¥óªºÄÝ©Ê¡A¦]¬°¥L­Ì¥þ«ü¦V¬Û¦Pªº¸ê®Æ°Ï°ì¡C²Ä¤@­Ó¨ú±o°Ñ·Ó¨ìª«¥óªºª«¥óÅܼƨèS¦³¥ô¦ó¯SÅv¡A¤]»Pµy«á«ü¬£ªºÅܼƨS¦³¥ô¦ó¯S®íªº®t§O¡C
    ¡@
  • ¦]¦¹ª«¥óÅܼƬO¤@­Ó´î¤Ö¸ê·½¥ÎºÉªºµ´¨Î¤èªk¡]¦]¬°¸ê®Æ¥u¤@¦¸³Q¤À°t¡^¡A¥BÁקK¸ê®Æ¤£¤@­P¡C¥u¦³¤@¥÷ÄÝ©Ê°Æ¥»¡F¥u­n´¿³z¹L¤@­Óª«¥óÅܼƨӧó·s¡A©Ò¦³¨ä¥LÅܼƥߧY¬Ý¨ì·sªº­È¡C¬°¨ú±o¬Y¨ÇÆ[ÂI¡A¦Ò¼{³\¦h¸ê®Æ®w¶}µoªÌ­±¹ïªº¤£¦P°ÝÃD¡A·í¥L­Ì¤À´²¸ê®Æ¦b¼Æ­Ó¸ê®Æªí¤¤¡C­Y¸ê®Æ­«½Æ¦b³\¦h¸ê®Æªí¤¤¡A·í¥L­Ì»Ý­n­×¥¿¸ê®Æ®É¡A¥²¶·¤p¤ß§ó·s©Ò¦³ªº¸ê®Æªí¡C­Y¨S¦³³o»ò°µ±N·|³y¦¨¸ê®Æ®w²V¶Ã¡C
    ¡@
  • ³]©w¤@­Óª«¥óÅܼƬ°Nothing-©ÎÅý¥L¶W¥X½d³ò¥B³QVisual Basic¦Û°Ê³]©w¬°Nothing -¤£¬O¥²µM¦a·|ÄÀ©ñÅܼƫü¦Vªºª«¥ó¡C¨Æ¹ê¤W¡A­Y¨ä¥LÅܼÆÁÙ«ü¦V¬Û¦Pªºª«¥ó¡A«h¦¹°O¾ÐÅé°Ï°ì©M©Ò¦³ÄݩʬҤ£·|ÄÀ©ñ¡C
    ¡@

³Ì«á´£¨ì¤@­Ó°ÝÃD¡G¤@­Óª«¥ó¦ó®É¹ê»Ú³QÄÀ©ñ¡Hµ²ªG¬O·í¨S¦³¥ô¦óª«¥óÅܼƫü¦V¸Óª«¥ó®É¡AVisual Basic·|ÄÀ©ñ¦¹ª«¥ó¡G

Sub TryMe()
    Dim p1 As CPerson, p2 As CPerson
    Set p1 = New CPerson             ' Creates object "A"
    p1.LastName = "Smith"
    Set p2 = p1                      ' Adds a 2nd reference to "A"
    Set p1 = New CPerson             ' Creates object "B", but doesn't
                                     ' release "A", pointed to by p2
    p1.LastName = p2.LastName        ' Copies a value, not an object ref
    Set p2 = Nothing                 ' Destroys the original "A" object
End Sub                              ' Destroys the second "B" object

¦p±z©Ò¨£¡A¬ö¿ý³\¦hÅܼƦp¦ó«ü¦V¤@­Óª«¥ó¥i¥H²³æ¨ìÅܦ¨Åý¤H®ð¾kªº¤u§@¡C©¯¹B¦a¡A³o¬OVisual Basicªº°ÝÃD¡A¦Ó¤£¬O±zªº¡CVisual Basic¨Ï¥Î©Ò¿×ªºreference­p¼Æ¾¹¨Ó¸Ñ¨M¦¹°ÝÃD¡A¤U¤@¸`·|§@»¡©ú¡C

ª«¥ó»â°ì
¡@

¹Ï6-8Åã¥Ü¤@­Ó¨å«¬ª«¥ó³Q¦p¦ó¦w±Æ¦b°O¾ÐÅ餤¡CVisual Basicµ{¦¡³]­p®v¥u¬Ý¨ì¤@¨Çª«¥óÅܼơG¦b³o­Ó¨Ò¤l¤¤¡A§Ú­Ì¦³¨â­ÓÅܼơAP1©MP2¡A«ü¦VCPersonÃþ§Oªº¹êÅé¡A¦Ó²Ä¤T­ÓÅܼÆP3«ü¦V¬Û¦PÃþ§O¦ý»P¨ä¥L¤£¦Pªº¹êÅé¡C¥ô¦ó®É­ÔVisual Basic«Ø¥ß¤@­Ó·sªºÃþ§O¹êÅé¡A¤À°t¤@­Ó°Ï¹j¶}ªº¡B©w¸q¦nªº°Ï¶ôªº°O¾ÐÅé¡]¹êÅé¸ê®Æ°Ï°ì¡^¡C³o¤@°Ï°ìªºµ²ºc©M¤j¤p¹ï©ó¥ô¦ó©Òµ¹ªºÃþ§O¬O©T©wªº¡A¨Ã¨Ì¿à©óª«¥ó¦³¦h¤ÖÄÝ©Ê¡BÄݩʪº«¬ºA¡A¥H¤Î¨ä¥L¥»¤å¤¤¥¼´£¤Îªº¦]¯À¡C³o¤@°Ï°ìªºµ²ºc¦bMicrosoft¤¤¨Ã¨S¦³³Q°O¸ü¡A¦ý©¯¹B¦a±z¤£»Ý­nÁA¸Ñ¸ê®Æ³QÀx¦s¦b­þ¸Ì©Î¥¦¦p¦ó³QºÞ²z¡C


¡@

¹Ï6-8 ª«¥óªºµ²ºc¥i¯à¤ñ±z©Ò¹w´Áªº§ó½ÆÂø¡C

µM¦Ó¡A¦³¤@¬q¸ê°T¬O¹ï©Ò¦³ªº¶}µoªÌ¯S§O­«­n¡G¤@­Ó¥|¦ì¤¸²Õ°O¾ÐÅé¦ì¸m¡AÁ`¬O¨ú±oª«¥óÅܼƫü¦V¨º¯S§O¹êÅé¸ê®Æ°Ï¶ôªº¼Æ¦r¡CÁ|¨Ò¨Ó»¡¡AJohn Smithª«¥ó¦³¤@­Ó°Ñ¦Ò­p¼Æµ¥©ó2¡A¦ÓAnne Brownª«¥ó¦³¤@­Ó°Ñ¦Ò­p¼Æµ¥©ó1¡C¹ï©ó­p¼Æ¾¹¨Ó»¡¥]§t¤p©ó1ªº­È¬O¤£¥i¯àªº¦]¬°·N§Y¨S¦³Åܼƫü¦V¤@­Ó¯S§Oªºª«¥ó¡A¥Bª«¥ó¥ß§Y³QÄÀ©ñ¡CµL½×¦p¦ó¡A±N³o­Ó°O¦b¤ß¸Ì¡A¤@¦pµ{¦¡³]­p®v©ÒÃö¤ßªº¡A°Ñ¦Ò­p¼Æ¾¹¬O¤@­Óµ´¹ïªº¹êÅé¡A¦]¬°¥¦¤£¯à¥Î¥ô¦ó¤èªk³QŪ¨ú©Î­×§ï¡]¦Ü¤Ö¡A¨Ï¥Îorthodox³]­p§Þ¥©¡^¡C¥i¥H¦Xªk¦a¨Ï°Ñ¦Ò­p¼Æ¾¹°ß¤@ªº§ïÅܬO¶¡±µ¦a¨Ï¥Î Set ©R¥O»¼¼W©Î»¼´î¥¦¡C

Set p1 = New CPerson     ' Creates an object and sets
                         ' its reference counter to 1
Set p2 = p1              ' Increments the reference counter to 2
Set p1 = Nothing         ' Decrements the reference counter back to 1
Set p2 = Nothing         ' Decrements the reference counter to 0
                         ' and destroys the object
                         ' (Or you can let p2 go out of scope....)

¦b¸ê®Æ°Ï¶ô¹êÅ骺§ÀºÝ¬O©Ò¦³Ãþ§O¼Ò²ÕªºÅܼƪº­È¡A¥]¬A©Ò¥H¼Ò²Õ¼h¦¸ÅܼƩM¦bµ{§Ç¤¤ªºÀRºAÅܼơ]¦ý¤£¥]¬A°ÊºAÅܼơA¦¹ÅܼƬO¦b¨C¤@¦¸©I¥sªº´Á¶¡¤À°t¦bStack¤¤¡^¡C·íµM¡A³o¨Ç­È¦b¹êÅ餤ÅܤơA§Y¨Ï¥L­Ìªº¥~Æ[¹ïÃþ§Oªº©Ò¦³¹êÅé¨Ó»¡¬O¬Û¦Pªº¡C

¦b¸ê®Æ°Ï¶ô¹êÅ餤¥t­Ó¥¼´£¤Îªº¸ê°T¬O«D±`­«­nªº¡G¥¦¥]§t Vtable «ü¼Ð¡C32¦ì¤¸°O¾ÐÅé¦ì§}¥i¥H¦b¸ê®Æ°Ï¶ô¹êÅ骺«eºÝ³Qµo²{¡A¬O¤@­Ó«ü¦V¦W¬° Vtable ªº¨ä¥LÃöÁä°O¾ÐÅ骺«ü¼Ð¡CÄÝ©ó¬Û¦PÃþ§O¤§©Ò¦³ª«¥ó«ü¦V¬Û¦P Vtable¡F¦b¸ê®Æ°Ï¶ô¹êÅé«e¥|­Ó¦ì¤¸²ÕÁ`¬O²Å¦X¡C·íµM¡A¹ï©ó¤£¦PÃþ§Oªºª«¥óªº«e¥|­Ó¦ì¤¸²Õ¬O¤£¦Pªº¡C

Vtable ¬O­ÓÃþ§O¦æ¬°ªº¹ê»Ú¯S©Ê¡A¦ý¥¦¥»¨­¬O«D±`©úÅ㪺¤p«¬¬[ºc¡C¨Æ¹ê¤W¡A¥¦¥u¬O jump table ªº¤@Ãþ¡A«ü¦V¹ê»Ú¥H½sĶµ{¦¡½Xªº¤@¨t¦Cªºªø«ü¼Ð¡C¨C¤@«ü¼Ð¬Û¹ï©ó¤@­Ó¨ç¼Æ¡B©Î¤@­ÓÄݩʵ{§Ç¡A¨Ã«ü¦V¦b½sĶ³B²z´Á¶¡¨C¤@µ{§Ç©Ò²£¥Íªº¤w½sĶµ{¦¡½X¤§²Ä¤@­Ó¦ì¤¸²Õ¡CŪ¡þ¼gÄݩʦb Vtable ¦³¨â­Ó¤£¦Pªº¶i¤JÂI¡A¥BÅܼÆÄÝ©Ê¥i¯à·|¦³¤T­Ó¶i¤JÂI¡A­Y±z¤]´£¨Ñ¤@­Ó Property Set µ{§Ç¡C¦]¬°¦b½sĶ´Á¶¡ª¾¹DÀ³¥Îµ{§Ç¥i¥H¦b­þ¸Ìµo²{¤@­Ó§K¶Oªº°O¾ÐÅé°Ï¶ôµ¹¤w½sĶµ{¦¡¤U¸ü¶i¥h¬O¤£¥i¯àªº¡A¨C¦¸½sĶ³W«hªº¦ì§}¥u¦³¦b°õ¦æ¶¥¬q¤~ª¾¹D¡C°ò©ó¦¹¡AVtable µ²ºc¤]¬O¦b°õ¦æ´Á¶¡°ÊºA«Ø¥ß¡C

ª«¥ó¹êÅé¤Æ¹Lµ{
¡@

²Ä¤@¦¸Visual Basic«Ø¥ß¤@­Ó¤wµ¹Ãþ§Oªºª«¥ó¡A¥¦ªº°õ¦æ´Á¶¡¼Ò²Õªí²{¦³¥H¤U³sÄòªº¹B§@¡G

  1. ¤À°t¤@°O¾ÐÅé°Ï¶ôµ¹Ãþ§O¼Ò²Õ²£¥Íªº¤w½sĶµ{¦¡½X¡A±qµwºÐ¤¤¤U¸üµ{¦¡½X¡C
  2. ¤À°t¤@­Ó¡]¤p«¬ªº¡^°O¾ÐÅé°Ï¶ôµ¹ Vtable ¥»¨­¡AµM«á¥Î¦bÃþ§O¼Ò²Õ¤¤ªº¤½¶}³W«hªº¶i¤J«ü¼Ð°O¾ÐÅé¶ñº¡¡C
  3. ¤À°t¤@°Ï¶ôµ¹¤@¯S§Oª«¥ó¹êÅé¡A³]©w«e32¦ì¤¸­È«ü¦V Vtable¡C³o¤@«ü¼Ð¡A¥¦¤]IJµo Class_Initialize ¨Æ¥óµ{§Ç¬°¤FÅܼưϰì¥i¥H¥¿½T³Qªì©l¤Æ¡C
  4. Àx¦s¦b¥Ø¼Ðª«¥óÅܼƪº¸ê®Æ°Ï°ì¹êÅ骺°O¾ÐÅé¡C¦¹¤@«ü¼Ð¡A¥Î¤áºÝµ{¦¡½X¥i¥H¥Îª«¥ó°µ¤Z¬O¥¦·Q­n°µªº¨Æ¡C

³o¤@¦ê°Ê§@¥u¦b²Ä¤@¦¸µ{¦¡½X«Ø¥ß¤@­Ó©Òµ¹©wÃþ§Oªºª«¥ó®É¥²¶·°õ¦æ¡C¹ï©ó¬Û¦PÃþ§Oªº©Ò¦³¤@¨t¦Cª«¥ó¡A²Ä¤@©M²Ä¤G¨BÆJ¥i¥H¬Ù²¤¦]¬° Vtable ¤w¸g¦b¾A·íªº¦a¤è¡C·í²³æ¦a¤À°tª«¥óÅܼơA²Ä¤T¨BÆJ¤]¥i¥H¬Ù²¤¡A¥þ³¡ªº°Ê§@Åܦ¨¥u¦³32¦ì¤¸­È³Q¤À°t¡C

ª«¥ó¥Îªk
¡@

Åý§Ú­ÌÁ@Á@·í¥Î¤áºÝµ{¦¡½XIJ¤Î¤@­Óª«¥óªº¤èªk©ÎÄݩʮɷ|µo¥Í¤°»ò¨Æ±¡¡C³o¸Ì¥u¸ÑÄÀ³\¦h¥i¯à±¡ªp¤Uªº¤@­Ó¡A´N¬O±qÄÝ©ó¦P¤@±M®×ªºÃþ§O¨Ï¥Î¤@­Óª«¥ó¡C¬JµM½sĶ¾¹ª¾¹DÃþ§O¦p¦ó³Q¦w±Æ¡A¤]ª¾¹DÃþ§Oªº Vtable ¬Ý¦ü­þ¤@ºØ¡C·íµM¡A¤£¯àª¾¹D¦b½sĶ´Á¶¡Ãþ§Oªº¤w½sĶµ{¦¡½X±N·|¸¨¦b¦ó³B¡A¦ý¬O·íÃþ§O³Q½sĶ®É¡A¦Ü¤Ö¥¦ªºµ²ºc¥i¥H³Q¨M©w¡C¦]¦¹¡A½sĶ¾¹¥i¥H¦w¥þ¦aÂà´«°Ñ·ÓªºÄݩʩΤèªk¨ì Vtable ªº°Ï¶¡¤¤¡C¦]¬°¦b Vtable ªº­º­n¤C­Ó¶µ¥Ø³q±`³Q¨ä¥L¦ì§}¨ú±o¡]¥»¤º®e¨Ã¤£·|´£¤Î¡^¡A²Ä¤@­Ó©w¸q¦bÃþ§O¤¤ªºÄݩʩΤèªk¦³¤@­Óµ¥©ó28ªº°Ï¶¡¡]7 items * 4 bytes each¡^¡C¥H§Ú­Ì©Ò´£ªºÃþ§O¨ÓÁ¿¡A¬Û¹ï©ó Property Get FirstName µ{§Çªº°Ï¶¡¡C·í¥Î¤áºÝµ{¦¡½X°õ¦æ³o±Ô­z¡G

Print p1.FirstName

¦b³o¤§«á¦h¦h¤Ö¤Ö·|µo¥Íªº±¡ªp¦³¡G

  1. ¬°¤F¯à°÷¦s¨úª«¥óÅܼƫü¦Vªº¸ê®Æ°Ï¶ô¹êÅé¡AVisual Basic¨ú±o²{¦b¦bP1Åܼƪº32¦ì¤¸¼Æ¡C
  2. ¦b¸ê®Æ°Ï¶ô¹êÅ骺¶}ÀY¡AVisual Basicµo²{ Vtable ªº¦ì§}¡C¬JµM½sĶ¾¹ª¾¹D§Ú­Ì­n¨D°õ¦æ Property Get FirstName¡A±N¦¹­È¥[¤W28¨Ã¥B·j´M§Ú­Ì­n°õ¦æªº½sĶ³W«h¶}ºÝªº¦ì§}¡C
  3. ³Ì«áµ{¦¡©I¥s¤w½sĶµ{¦¡½X¡A¶Ç»¼­ì©lªºP1ª«¥óÅܼƤº®eµ¹¥¦¡]¸ê®Æ°Ï¶ô¹êÅé¦ì§}¡^¡C¦]¬°¤w½sĶªºµ{¦¡½Xª¾¹D¹ï©ó©Òµ¹ªºÃþ§Oªº¸ê®Æ°Ï¶ô¹êÅé¬[ºc¡A¥¦¥i¥H¦s¨ú©Ò¦³ªº¨p¤HÅܼơA´N¹³ m_FirstName¡A³B²z¥L­Ì¡AµM«á¶Ç¦^¤@­Ó¦³·N¸qªº­Èµ¹©I¥sªÌ¡C

¨ú±o¤@­Ó­Èªº¹Lµ{¬O«Üº©ªøªº¡A³o¬Oª«¥ó¹B§@ªº¨Æ±¡¡Cª¾¹D©Ò¦³ªº¨Æ±¡¤£·|À°§U±z¼g¥X§ó¦nªºµ{¦¡½X¡A¦Ü¤Ö¤£¯à¥ß§Yªº¡C¦ý¬O§Ú½T©w¦b¥¼¨Ó±z±N«Ü¤Ö»Ý­n³o¨Ç¸ê°T¡C


¤p¯µ³Z

³q±`¡A¹ïª«¥ó¤À¬£©MÄÀ©ñ¹êÅé¸ê®Æ¶ô¬O¬Û·í½wºCªº°Ê§@¡C­YÃþ§O¼Ò²Õ¦b Class_Initialize ¨Æ¥ó°õ¦æ¤Ó¦hµ{¦¡½X-¨Ò¦p¡A¥²¶·±q¸ê®Æ®w¡BRegistry©ÎINIÀɮפ¤¨ú±o¸ê®Æ¡A³o¦¨¥»·|Åܦ¨¦M«æªº¡C°ò©ó¦¹¡A¹Á¸Õ«ü¬£ª«¥ó¬°¥þ°ìÅܼƨӫO«ù¹êÅé¦s¬¡¡A¥u·í½T©w¤£¦A»Ý­nª«¥ó®É¤~ÄÀ©ñ¡]©Î·íÀ³¥Îµ{¦¡§Y±N¹F¨ì²×¤îÅýVisual Basic¦Û°Ê³]©wÅܼƬ°Nothing¡^¡C¤]¥i¯à´£¨Ñ¤@­Ó¯S§Oªº¤èªk-¨Ò¦p¡AReSet¢w­«·s¥X©l¤Æ©Ò¦³°Ï°ìÅܼƦӤ£»Ý«Ø¥ß·sªº¹êÅé¡C


ª«¥óµ²§ô¹Lµ{
¡@

·í¤£¦A¦³ª«¥óÅܼƫü¦V¤@­Óµ¹©w¹êÅ骺¸ê®Æ¶ô®É¡Aª«¥ó±N³QÄÀ©ñ¡CÄÀ©ñ°O¾ÐÅé«e¡AVisual Basic·|¦bÃþ§O¼Ò²ÕIJµo Class_Terminate ¨Æ¥óµ{§Ç-­Yµ{¦¡³]­pªÌ¦³«Ø¥ßªº¸Ü¡C³o¬O­Ó©ñ¸m²M°£µ{¦¡½Xªºµ{§Ç¡C

Visual Basic¨S¦³ºÞ¨ì³o»ò¦h¡AÁ|¨Ò¨Ó»¡¡A®Ú¥»§Y¨Ï¨S¦³¥ô¦óª«¥ó«ü¦V Vtable¡AVisual Basic¤£·|ÄÀ©ñ Vtable¡C³o¬O¤@­Ó­«­nªº²Ó¸`¡A¦]¬°¥¦½T«O¤U¤@¦¸³oÃþ§Oªº¨ä¥Lª«¥ó³Q«Ø¥ß¡A¦¨¥»±N·|³Ì¤p¡C³o¸Ì¦³¨â¥ó¦³Ãö²×¤î¶¥¬qªº¨ÆÀ³¸Óª¾¹D¡G

  • Visual Basic«H¥ô¦w¥þ¾÷¨î¡A¯à°÷¨¾¤îµ{§Ç¥¿¦b°õ¦æ®Éª«¥ó³Q¯}Ãa¡C·Q·Q¥H¤Uªº±¡ªp¡G¦³­Ó¥u¥Ñ¤@­Ó°Ñ·Ó¨ì¤@­Óª«¥óªº¥þ°ìª«¥óÅܼơA¥B¦bÃþ§O¼Ò²Õ¤¤ªºµ{§Ç¤¤¡A³]©w¦¹¥þ°ìÅܼƬ°Nothing¡A¦]¦¹¥u¯}Ãaºû«ùª«¥ó¥Í¦sªº°Ñ·Ó¡C­YVisual Basic¯uªº¬O·M²Âªº¡A¤@¥¹¥¦°õ¦æ³o­Ó«ü¬£«á¡A¥¦·|¥ß§Y²×¤îµ{§Ç¡C¬Û¤Ï¦a¡AVisual Basicµ¥­Ôµ{§Çµ²§ô¨Ã¥B¥u¯}Ãaª«¥ó¨ÃIJµo¥¦ªº Class_Terminate ¨Æ¥óµ{§Ç¡C´£°_³o­Ó°ÝÃD¥u¬°¤F¦w¥þ¡A§¹¥þ¨S¦³·N«ä­n¹ªÀy±z¨D§U©ó³o¤£°·¥þªºµ{¦¡¼g§@§Þ¥©¡C¤@­ÓÃþ§O¼Ò²ÕÀ³¸Ó±q¤£°Ñ·Ó¥þ°ìÅܼƦ]¬°³o·|¯}Ãa¦Û§Ú§¹¾ã©Ê¡C
    ¡@
  • ¤@¥¹¦b Class_Terminate ¨Æ¥óµ{§Ç¤¤°õ¦æµ{¦¡½X¡AVisual Basic¤w¸g·Ç³Æª«¥ó²×¤îªº³B²z¡A¥B±z±NµLªk°µ¥ô¦ó¨Æ¥H¨¾¤îª«¥ó³Q¯}Ãa¡C¨Ò¦p¡A¥ý«e©Ò´£ªº±¡ªp¡A¥i¯à¬Û«H¥i¥HÂǥѫü©w·sªºª«¥ó°Ñ·Ó¨ì¥þ°ìÅܼƺû«ùª«¥óÄ~Äò¥Í¦s¡A§Æ±æ¦A¼W¥[¤º³¡°Ñ·Ó­p¼Æ¥H¨¾¤îª«¥ó®ø¥¢¡CµM¦Ó¡A­Y¹Á¸Õ³o»ò°µ¡A¹ê»Ú¤W·|µo¥Í¡GVisual Basic­º¥ý§¹¥þ®ø·À¥Ø«eª«¥ó¡AµM«á«Ø¥ß¤@­Ó·sªº»P¤§«eµLÃöªº¹êÅé¡C
    ¡@

Binding§Þ¥©
¡@

«e­±ªº³¹¸`¡A±j½ÕÀ³¥Î¨t²Î¨Ï¥Î¦b Vtable ªº©è¾P­È¤Î¤èªk©MÄÝ©Ê¡C³o¨Ï±o©Ò¦³ª«¥ó°Ñ·Ó¬°¦³®Ä²vªº¡A¦]¬°CPU¥²¶·¥u¯à°õ¦æ¤@¨Çªþ¥[©M¨ä¥¦ªº°ò¥»¨BÆJ¡C±q Vtable ªº°Ï¶¡¨ú±oÄݩʩΤèªk¦WºÙªº¹Lµ{´N¬Obinging¡C¦p¦P©Ò¬Ý¨ìªº¡A³o­Ó¹Lµ{³q±`¬O³Q½sĶ¾¹©Ò°õ¦æ¡AµM«á¦b°õ¦æ´Á¶¡½sĶ¾¹¶Ç»¼·Ç³Æ³Q°õ¦æªº¦³®Äµ{¦¡½X¡A¨Ã«D©Ò¦³ª«¥ó°Ñ·Ó¦p¦¹¦³®Ä²v¡CÅý§Ú­Ì¬Ý¬Ý¦p¦óªýê½sĶ¾¹¡C

Dim obj As Object
If n > = 0.5 Then 
    Set obj = New CPerson
Else
    Set obj = New CCustomer
End If
Print obj.CompleteName

Visual Basic½sĶ¾¹µLªk¨M©w¦b°õ¦æ´Á¶¡¡AobjÅܼƱN§¹¥þ¦a±±¨î­þ¤@¤è­±ªº¨Æ±¡¡A¨Æ¹ê¤W¡Aª«¥ó¤º®e§¹¥þ¤£¥i¹wª¾ªº¡C¦¹°ÝÃD¬O§Y¨ÏCperson©MCcustomerÃþ§O¤ä´©¬Û¦Pªº CcompleteName ¤èªk¡A¦bVtableªº¬Û¦P°Ï¶¡«ÜÃø¥X²{¡C¦]¦¹½sĶ¾¹µLªk§¹¥þ³s±µ³B²z¹Lµ{¡A¥BÀx¦s¦b°õ¦æ´Á¶¡¥²¶·³QIJµoªº¤èªk¦WºÙ¤¤ªº¥i°õ¦æµ{¦¡½X¡C·í°õ¦æ³Ì«á¤@¦æ¡AVisual Basic¬d¸ß obj ÅܼơA¨M©w±±¨î­þ¤@­Óª«¥ó¡A³Ì«á©I¥s¥¦ªº CompleteName ¤èªk¡C

¤§«e©Ò¬Ý¨ìªº±¡ªp¦³«Ü¤jªº¤£¦P¡A·í§Ú­Ìª¾¹D¦b½sĶ´Á¶¡­þ¤@­Ó§¹¾ãªºªº³W«h±N·|³Q©I¥s¡C¦³¤TºØ¤£¦P«¬ºAªºbinging¡C

 Early VTable Binding Early binding¹Lµ{¦b½sĶ´Á¶¡´N§¹¦¨¡C½sĶ¾¹²£¥ÍVtable °Ï¶¡¡A¦¹°Ï¶¡©ó°õ¦æ¶¥¬q³Q¦³®Ä¥Î¨Ó¦s¨úª«¥óÄÝ©Ê©M¤èªk¡C­Y¦¹ÄݩʩΤèªk¤£³Q¤ä´©¡A½sĶ¾¹¥i¥H¥ß§Y´£¥X¿ù»~¡A·N¦®early binding·t³ë¶Ç»¼°·¥þªºÀ³¥Î¡C¤£½×¬O§_¨Ï¥Î¤w©w¸q¦nªºÅܼƫ¬ºA¡AEarly binding³£·|³Q¨Ï¥Î¡C·í¦bª«¥ó¦WºÙ¤W¥[¤W¤p¼Æ²Å¸¹ª«¥ó±N·|¨Ï¥Îearly binding¡A¦Ó±z±N·|¦³¦¹¶¡±µªº¸ê°T¡GVisual Basic½s¿è¾¹¯à°÷µ¹©Ò¦³¥i¯àªº¤èªk©MÄݩʦCªí¡C­Y½s¿è¾¹¯à°÷°µ¨ì³o¼Ë¡A½sĶ¾¹¥i¥Hµy«á§¹¦¨binding¡C

 Late Bindin ·í¨Ï¥Î As Object ©Î As Variant «Å§iª«¥óÅܼơA½sĶµLªk±Àºtª«¥ó¬O¦óºØ«¬ºA¡A³o¼ËªºÅܼƱN¥]§t¨Ã¥B¥i¯à¦]¦¹¥uÀx¦s¦³ÃöÄݩʪº©Î¤èªkªº¦WºÙ©M¤Þ¼Æ¸ê°T¡CBinding¹Lµ{¦b°õ¦æ´Á¶¡§¹¦¨¡A¥BÅܼƳQ°Ñ·Óªº¥ô¦ó´Á¶¡³Q°õ¦æ¡C·Q¹³¤@¤U¡A³o·|ªá¶O«Ü¦h®É¶¡¡A¦¹¥~¹ïÅܼƥ]§t¤ä´©©Ò·Q­nªº¤èªk¨S¦³¥ô¦ó«OÃÒ¡C­Y¹ê»Ú¤Wªºª«¥ó¤£¤ä´©¦¹¤èªk¡A°õ¦æ´Á¶¡ªº¿ù»~±N·|µo¥Í¡C­Y¦³­Ó³q¥Îªº As Object ÅܼơA¦bµ{¦¡¼Ò²Õ¤¤¦W¦r¤W¥[¤W¤p¼ÆÂI²Å¸¹¨Ã¤£·|¥X²{ÄÝ©Ê©M¤èªkªº¤U©Ô¦¡¿ï³æ¡C

 Early ID Binding ¬°¤F§¹¾ã©Ê¡A¥²¶·ª¾¹D²Ä¤TºØbinding¡A¦¹binding¦æ¬°·|¸¨¦b¥ý«e´£¨ìªº¨âªÌ¤§¶¡¡Cearly ID binding±¡ªp¤U¡A¦b Vtable ¤¤½sĶ¾¹µLªk¨ú±o¹ê»Ú¸ÉÀv¡A¦ý¦Ü¤Ö¥i¥H½T»{ÄݩʩΤèªk¦³¦b¡C­Y¦p¦¹¡A½sĶ¾¹¦b°õ¦æªºµ{¦¡½X¤¤Àx¦s¯S§OªºID­È¡C°õ¦æ´Á¶¡¡AVisual Basic¨Ï¥Î³o­ÓID¦bª«¥óªº¤@¦ê¤èªk¤¤°µ§Ö³tªºÆ[¬Ý¡C¤ñearly VTable binding³t«×ºC¡A¦ý¤´µM¤ñlate binding§ó¦³®Ä²v¡C¥¦¤]½T«O¨S¦³¿ù»~µo¥Í¦]¬°§Ú­Ì²@µLºÃ°Ý¦aª¾¹D³o­Ó¤èªk¬O³Q¤ä´©ªº¡C³o¤@Ãþ«¬ªºbinding¹ï¬Y¨Ç³QÀ³¥Îµ{¦¡¨Ï¥Îªº¥~³¡ª«¥ó¦³¥Îªº¡A¨Ò¦p¡A©Ò¦³ActiveX±±¨î¶µ¡C

¦]¦¹Â²³æªºªk«h¬OÁ`¬OÀ³¸Ó§V¤O¦bµ{¦¡½X¤¤¨Ï¥Îearly binding¡C°£°·¥þªº¦Ò¼{¤§¥~¡Alate binding¼W¥[®Ä²v­t¸ü¡A¦h¼Æ±¡ªp¤¤´X¥GµLªk­t²ü¡C¶Èµ¹±z¤@­Ó·Qªk¡A¨Ï¥Îlate binding¦s¨ú²©öªºÄݩʤj¬ù¬O³Ì¦³®Ä²vearly bindingªº¨â¦Ê­¿ºC¡C·í©I¥sµ{¦¡½X¶V½ÆÂø¡C³o®t¶Z·|­°§C¡A¦]¬°early binding¥u¼vÅT©I¥s´Á¶¡¡A¤£¬O¦b¤èªk¤¤ªºµ{¦¡½X°õ¦æ´Á¡C§Y«K¦p¦¹¡A¥i´X¥G¤£¦Ò¼{µLÃöºò­nªº®t§O¡C

³Ì«á°O¦í«Å§i¤@­Óª«¥óÅܼƪº¤èªk¼vÅTVisual Basic¨Ï¥Îearly binding©Îlate binding»P§_¡A¦ý¨S¦³¿ìªk¨M©wVisual Basic¨Ï¥Î­þ¤@ºØearly binding«¬ºA¡CµM¦Ó¥i¥H½T»{ªº¬OÁ`¬O¨Ï¥Î³Ì«K§Qªº¤@­Ó¡C­Yª«¥ó¦b¥Ø«eÀ³¥Î¨t²Î¤¤³Q©w¸q©Î¨ä¦³Ãöªº Vtable ¿é¥X¸ê°Tªºlibrary¬Oµ²ºc¤Æªº¡AVisual Basic¨Ï¥Î§ó¦³®Ä²vªº Vtable binding¡F§_«h¡A¨Ï¥Îearly ID binding¡C

¦A½Íª«¥óÃöÁä¦r
¡@

¼ô¤§©Ò¦³Ãö©óª«¥óªºª¾ÃÑ«á¡AÀ³¸Ó¹ï©ó¤@¨ÇVBAÃöÁä¦r«áªº¯u¹ê¾÷¨î´N¤£Ãø¤F¸Ñ¤F¡C

NewÃöÁä¦r
¡@

NewÃöÁä¦r¡]¦b Set ©R¥O¤¤¨Ï¥Î¡^§iª¾Visual Basic«Ø¥ß¤@­Ó¥þ·sªºµ¹©wÃþ§O¡CµM«áÃöÁä¦r¶Ç¦^¸ê®Æ­è­è³Q¤À°tªº¦ì§}¡C

Set©R¥O
¡@

Set ©R¥O²©ö¦a±Nµ¥¸¹¥kÃ䪺ªF¦è½Æ»s¤@¥÷µ¹µ¥¸¹¥ªÃ䪺ª«¥óÅܼơCÄ´¦p¡A³o­È¥i¥H¬O New ÃöÁä¦rªºµ²ªG¡A¥t¤@­Ó¤w¸g¦s¦bªºÅܼƪº¤º®e¡A©Î¬°­pºâ¤@­Óª«¥óªºµ²ªG¡CSet ©R¥O°õ¦æªº°ß¤@¤u§@¬O»¼¼W¬Û¹ï©ó¸ê®Æ°Ï¶ôªºreference­p¼Æ¾¹©M»¼´î­ì¥»«ü¦V¥ª¤âÃäÅܼƪºª«¥óªº°Ñ·Ó­p¼Æ¡]­YÅܼƨS¦³¥]§tNothing­È¡^¡C

Set P1 = New CPerson           ' Creates an object, stores its address
Set P2 = P1                    ' Just copies addresses
Set P2 = New CPerson()         ' Lets P2 point to a new object, but also
                               ' decrements the reference counter
                               ' of the original object

Nothing­È
¡@

Nothing ÃöÁä¦r¬OVisual Basic¤¤¹ïª«¥óÅܼƻ¡ Null ©Î 0 ªº¤èªk¡C±Ô­z¦p¤U¡G

Set P1 = Nothing

¦b Set »yªk¤U³o¨Ã«D¯S®í¨Ò¤l¡A¦]¬°¥¦¥u»¼´î¥ÑP1«ü¦Vªº¸ê®Æ°Ï¶ô°Ñ·Ó¼Æ¡AµM«á¦bP1¥»¨­ÅܼƤ¤Àx¦s¬°0¡A¦p¦¹±qª«¥ó¤¤¤ÀÂ÷¥¦¡C­YP1¬O¥Ø«e«ü¦V³o¹êÅ骺°ß¤@ÅܼơAVisual Basic¤]·|ÄÀ©ñ¦¹¹êÅé¡C

Is¹Bºâ¤l
¡@

Is ¹Bºâ¤l³QVisual Basic¥Î¨Ó½T»{¨â­Óª«¥ó¬O§_«ü¦V¦P¤@¸ê®Æ°Ï¶ô¡C¦b³Ì§Cªº¼h¦¸¤U¡AVisual Basic¨S¦³°µ¥ô¦ó¨Æ¡A¦ý·|¤ñ¸û¥]§t¦b¨â­Ó¹Bºâ¤¸ªº¹ê»Ú¦ì§}¡A­Y²Å¦X«h¶Ç¦^True¡C¥u¦³°ß¤@¥i¯àªºÅܤƬO·í¨Ï¥Î Is Nothing ÀË´ú®É¡AVisual Basic·|¤ñ¸û¥]§t0­È¤§ÅܼơC»Ý­n¯S§Oªº¹Bºâ¤l¡A¦]¬°µ¥¸¹¦³§¹¥þ¤£¦P·N¸q¡A¨ä·|IJµoª«¥ó¹w³]Äݩʪº­pºâ¡C

' This code assumes that P1 and P2 are CPerson variables, and that
' Name is the default property of the CPerson class.
If P1 Is P2 Then Print "P1 and P2 point to the same CPerson object"
If P1 = P2 Then Print "P1's Name and P2's Name are the same"

TypeOf...Is±Ô­z
¡@

¥i¨Ï¥Î TypeOf...Is ±Ô­zÀËÅ窫¥óÅܼƪº«¬ºA¡G

If TypeOf P1 Is CPerson Then
    Print "P1 is of type CPerson"
ElseIf TypeOf P1 Is CEmployee Then
    Print "P1 is of type CEmployee"
End If

±zÀ³¸Ó­nª¾¹D¨â­Ó­­¨î¡C­º¥ý¡A¦b¦P¤@®É¶¡¤º¥u¯àÀËÅç¤@­ÓÃþ§O¡A¥B¬Æ¦Ü¤£¥iª½±µÀË´úª«¥ó¬O§_¨Ã«D¬Y¯S©wÃþ§O¡C¦b¦¹±¡ªp¤U¡A½Ð¨£¤U¨Ò¡G

If TypeOf dict Is Scripting.Dictionary Then
    ' Do nothing in this case.
Else
    Print "DICT is NOT of a Dictionary object"
End If

²Ä¤G¡A¥u¦³Scripting library¡]¤@¯ëºÙ¬°°Ñ·Ó¨ç¼Æ¡^³Q¥]§t¦b°Ñ·Ó¹ï¸Ü®Ø¤¤¡A«h¥ý«eªºµ{¦¡¤~¯à¹B§@¡C­Y¨S¦³¡AVisual Basic±N·|©Úµ´½sĶ³oµ{¦¡½X¡C·í·Q­n¼¶¼g¥i¦A§Q¥Îªºµ{§Ç®É¡A¦³®É­Ô³o¬O¥ó³Â·Ðªº¨Æ¡C


¤p¯µ³Z

·í«ü©wª«¥óÅܼƳq±`¨Ï¥Î TypeOf...Is ±Ô­z¨ÓÁקK¿ù»~¡Aµ{¦¡½X¦p¤U¡G

' OBJ holds a reference to a control.
Dim lst As ListBox, cbo As ComboBox
If TypeOf obj Is ListBox Then
    Set lst = obj
ElseIf TypeOf Obj Is ComboBox Then
    Set cbo = obj
End If

¦ý¬O³o¸ÌÁÙ¦³§ó§Ö§ó²­nªº¤èªk¡G

Dim lst As ListBox, cbo As ComboBox
On Error Resume Next
Set lst = obj     ' The assignment that fails will leave
Set cbo = obj     ' the corresponding variable set to Nothing.
On Error Goto 0   ' Cancel error trapping.

TypeName¨ç¼Æ
¡@

TypeName ¨ç¼Æ¶Ç¦^¦bªí³æ¦r¦ê¤¤ª«¥óÃþ§Oªº¦WºÙ¡C·N§Y¥iµo²{¦h¼Æºë²ªºªí³æ¤¤ª«¥óªº«¬ºA¡A¦p¤U¡G

Print "P1 is of type " &; TypeName(P1)

¦h¼Æ±¡ªp¤U¡A¨Ï¥Î TypeName ¨ç¼ÆÀËÅ窫¥ó«¬ºA¬OÀu©ó¨Ï¥Î TypeOf...Is±Ô­z¡A¦]¬°ª«¥ó¤£»Ý­n¦b¥Ø«eÀ³¥Îµ{¦¡¤U©Î°Ñ·Ó¹ï¸Ü¤è¶ô¤¤¥X²{¡C

ByVal©MByRefÃöÁä¦r
¡@

ª«¥óÅܼƶȶȬO«ü¼Ðªº¨Æ¹ê¥i¯à·|¨Ïµ{¦¡³]­pªÌ·P¨ì°g´b¡A·íª«¥óÅܼƥHByVal ¤Þ­z³Q¶Ç»¼µ¹µ{§Ç¡C¨âªÌªº®t²§¦b©ó—µ{§Ç¥i§ó§ï¤@­Ó ByVal ­È¡A¦Ó¤£·|¼vÅT©I¥sªÌªº­ì©l­È¡C¤]´N¬O»¡¡A±z¥i¥H²©ö¦a«Ø¥ß¤@­Ó½Æ»sªº«ü¼Ð¡A¦Ó¤£¬O¹êÅ骺¸ê®Æ°Ï°ì¡C­ì¥»ªº©M·sªºª«¥ó°Ñ·Ó¨âªÌ¬O«ü¦V¬Û¦Pªº¦a¤è¡A¦]¦¹©I¥sªºµ{§Ç¥i¥H¦Û¥Ñ¦aŪ¨ú©M­×¥¿©Ò¦³ª«¥óªºÄÝ©Ê¡C­Y­nÁקK¹ï­ì©lª«¥óªº­×§ï¡A¥²¶·¶Ç»¼¤@¥÷½Æ»sªºª«¥óµ¹µ{§Ç¡C¦p¦¹°µ¡A§Ú­Ì¥²¶·¦Û¤v«Ø¥ß·sªºª«¥ó¡CVisual Basic¨Ã¤£´£¨Ñ¦¹±¶®|¡C

³oªí¥Ü±z»Ý­nÁA¸Ñ·í¨Ï¥Î ByRef ©Î ByVal «Å§i¤@­Óª«¥ó°Ñ¼Æ¦³¨Ç¤£¦P¡A¥H¤Uµ{¦¡½X¥i¨Ç·L¬Ý¥X¤£¦P¡G

Sub Reset(pers As Cperson)     ' ByRef can be omitted.
    Set pers = Nothing         ' This actually sets the original
End Sub                        ' variable to Nothing.

Sub Reset2(ByVal pers As CPerson)
    Set pers = Nothing         ' This code doesn't do anything.
End Sub

¨Ï¥Î ByVal ¶Ç»¼ª«¥ó¡A¤º³¡°Ñ·Ó­pºâ¼È®É»¼¼W¡A·íµ{§ÇÂ÷¶}¤S¦A»¼´î¡C­Y¥H°Ñ·Ó¨Ó¶Ç»¼ª«¥ó«h¤£·|µo¥Í¦¹¨Æ±¡¡C°ò©ó¦¹¡A¦bª«¥ó¤¤¨Ï¥Î ByRef ÃöÁä¦r·|µy·L§Ö¤@ÂI¡C

Class_Terminate¨Æ¥ó
¡@

¦bÄÀ©ñ¸ê®Æ°Ï¶ô©M²×¤îª«¥óªºÀɮ׫e¡AVisual Basic·|IJµo Class_Terminate ¨Æ¥ó¡C·í»Ý­n¨ú®ø¦bªì©l´Á¶¡©Î¦b¥Í©R´Á©Ò°µªº¨Æ±¡®É¡A³q±`·|¦b¦¹¨Æ¥ó¤º¼¶¼g¬ÛÃöµ{¦¡¡C¤@¯ë¦b³o¨Æ¥óµ{§Ç¤º¡A·|Ãö³¬¥ô¦ó¶}±ÒªºÀɮסA¥BÄÀ©ñ±qAPI©I¥sÀò¨úªºµøµ¡¸ê·½¡C­Y·Q­n¨Ïª«¥óÄÝ©Ê«O«ù¦b¸ê®Æ®w¤º¡A¥H«K¥¼¨Ó¥i¨Ï¥Îªº¸Ü¡A³q±`¤]·|¦b¦¹°µ¬ÛÃöµ{§Ç¡CµM¦Ó¡AÁ`¦Ó¨¥¤§¡A´X¥G«Ü¤Ö¹ï³o¨Æ¥ó¼¶¼gµ{¦¡¡A©Î¦Ü¤Ö¬Û¹ï©ó Class_Initialize ¨Æ¥ó¨Ó»¡¬O¤Ö¦h¤F¡CÁ|¨Ò¨Ó»¡¡ACPersonÃþ§O¼Ò²Õ¹ê»Ú¤W¦b¥¦ªº Class_Terminate ¨Æ¥óµ{§Ç¤¤¬O¤£»Ý­nµ{¦¡ªº¡C

´«¥y¸Ü»¡¡A¼¶¼g¥i°õ¦æªºµ{¦¡¡A¨Ã¥B½T©w·íª«¥ó³QÄÀ©ñ®É¤´¥i³Q°õ¦æªº¨Æ¹ê¶}±Ò¤F¤£»Ý­n¥ô¦ó¨ä¥L¡A«DOOP§Þ¥©ªº¥i¯à©Ê¡C¬°¤F½T«O±zÁA¸Ñµ§ªÌªº·N«ä¡Aµ§ªÌ·Ç³Æ¤F¦b³o·§©À¤U´X¥G§¹¾ãªº¤T­Ó½d¨ÒÃþ§O¡C³o¬O­ÓÅý±zÁA¸Ñ¥i¥H¨Ï¥Îª«¥ó©Òªþ»Pªº¯à¤O§â¼Æ­Ó¥­±`ªºµ{¦¡¤u§@³]­p§¹¦¨ªº®É¾÷¡C


ª`·N

¥u·íª«¥ó¥Î¨Ì§Çªº¤è¦¡³QÄÀ©ñ¡A·í©Ò¦³«ü¦Vª«¥óªº°Ñ¦Ò³Q³]¬°Nothing©Î¶W¥X½d³ò¡A©Î·íÀ³¥Îµ{¦¡¹F¨ì²×ÂI¡AVisual Basic¤~©I¥s Class_Terminate ¨Æ¥ó¡C³o¥]¬A·íÀ³¥Îµ{¦¡¦]­P©Rªº¿ù»~¦Óµ²§ô¡C¥u·í±qRun¿ï³æ©Î¤u¨ã¦C¤¤ªºEnd«ö¶s¬ðµMµ²§ôµ{¦¡¡AVisual Basich¤~¤£·|¤Þµo Class_Terminate ¨Æ¥ó¡C³o¥ß¨è°±¤îµ{¦¡½X¤¤ªº©Ò¦³°Ê§@¡A·N«ü¨S¦³¥ô¦óClass_Terminate¨Æ¥ó·|³QIJµo¡C°²­Y¦b Terminate ¨Æ¥ó¤¤´¡¤J­«­nªºµ{¦¡½X—¨Ò¦p¡AÄÀ©ñÂÇ¥ÑAPI¤À°tªºµøµ¡¸ê·½—±N·|µo¥Í°ÝÃD¡C¦³®É­Ô³o¬O­Ó¤j°ÝÃD¡A¥]¬A¨t²Î·l·´¡C¦]¦¹¡Aµ{¦¡½X¤¤¨M¤£­n¨Ï¥ÎEnd©R¥O¨Ó²×¤îÀ³¥Îµ{¦¡¡G¦]¬°³o¦³µÛ¦P¼Ëªº·N«ä¡A¦ý¬O¦b½sĶÀ³¥Îµ{¦¡«á¡A©ó¥~¬É°õ¦æ®É¤~·|µo¥Í°ÝÃD¡C


½d¨Ò1¡GºÞ²z·Æ¹«´å¼Ð
¡@

µ{¦¡³]­p®v±`·|§ïÅܷƹ«´å¼Ðªºª¬ºA¡A¨å«¬ªº¦³¨Fº|¡A§iª¾¨Ï¥ÎªÌ¬Y¨Ç¸ûªøªº°Ê§@¥¿¦b¶i¦æ¡C·íµM¡A¤]¥²¶·¦bÂ÷¶}¥Ø«eµ{§Ç«e«ì´_´å¼Ð¡F§_«h¡A¨Fº|·|¤@ª½¥X²{¡A¦Ó¨Ï¥ÎªÌ«h¤£ÁA¸Ñµ¥«Ý¤wµ²§ô¡C³o¤u§@¬Û·í²³æ¡A§Úµo²{¦b¬Y¨Ç±¡ªp¤U¡A³\¦h°Ó·~À³¥Îµ{¦¡µLªk«ì´_­ì¥»ªºª¬ºA¡Cµ{§Ç¦b¨S¦³¹w´Á¤UÂ÷¶}¬O¤@­Ó«Ü²M·¡ªº¯gª¬¡A¦]¦¹³à¥¢¾÷·|¨Ó«ì´_­ì¥»ªºª¬ºA¡CÃþ§O©Mª«¥ó¦p¦óÀ°§U§Ú­ÌÁקK¬Û¦Pªº¿ù»~¡H¬Ý¤@¤UCmouseÃþ§O¼Ò²Õ§a¡I

' The CMouse class _ complete source code
Dim m_OldPointer As Variant

' Enforce a new mouse pointer.
Sub SetPointer(Optional NewPointer As MousePointerConstants = vbHourglass)
    ' Store the original pointer only once.
    If IsEmpty(m_OldPointer) Then m_OldPointer = Screen.MousePointer
    Screen.MousePointer = NewPointer
End Sub

' Restore the original pointer when the object goes out of scope.
Private Sub Class_Terminate()
    ' Only if SetPointer had been actually called
    If Not IsEmpty(m_OldPointer) Then Screen.MousePointer = m_OldPointer
End Sub

¤£Ãa§a¡H¥u¥Î¤K¦æµ{¦¡½X¥Ã»·¸Ñ¨M¤@¦Aµo¥Íªº¿ù»~¡I¬Ý¤@¤U¦b¹ê»Úµ{¦¡¤¤¦p¦ó²³æ¦a¨Ï¥Î¦¹Ãþ§O¡C

Sub ALengthyProcedure()
    Dim m As New CMouse
    m.SetPointer vbHourglass          ' Or any other pointer shape
    ' ... slow code here ... (omitted)
End Sub

¦¹§Þ¥©¥i¹B§@¡A¦]¬°¤@¥¹ÅܼƲæÂ÷¥i¥Îªº½d³ò¡Aª«¥ó·|³QÄÀ©ñ¡A¥BVisual Basic·|¤Þµo¨ä Class_Terminate ¨Æ¥ó¡C¦³½ìªº¤@ÂI¬O­Y¦]¬°¿ù»~¦Ó¾É­PÂ÷¶}µ{§Ç¡A³o¤@³s¦ê°Ê§@¤]·|µo¥Í¡AVisual Basic·|¨Ì§ÇÄÀ©ñµ{§Çªº©Ò¦³µ{§ÇÅܼơC

½d¨Ò2¡G¶}±Ò©MÃö³¬ÀÉ®×
¡@

¥t¤@­Ó±`¥Îªºµ{¦¡¤Æ¤u§@¬O¶}±Ò¤@­ÓÀɮרӳB²z¡AµM«á¦bÂ÷¶}µ{§Ç«eÃö³¬ÀɮסC¦p¦b ²Ä¤­³¹ ©Ò¬Ý¨ìªº¡A©Ò¦³³B²zÀɮתºµ{§Ç¥²¶·«OÅ@¦Û¨­¤£¨ü·N¥~ªº¿ù»~¤zÂZ¡A¦]¬°­Y¬ðµMµ²§ô·|¾É­PµLªk¥¿½T¦aÃö³¬ÀɮסC¦A¨Ó¡AÅý§Ú­Ì¬Ý¬ÝÃþ§O¦p¦ó¥Hºë²ªº¤è¦¡À°§U§Ú­Ì°µ¦n³o¥ó¨Æ¡C

' The CFile class--complete source code
Enum OpenModeConstants
    omInput
    omOutput
    omAppend
    omRandom
    omBinary
End Enum
Dim m_Filename As String, m_Handle As Integer

Sub OpenFile(Filename As String, _
    Optional mode As OpenModeConstants = omRandom)
    Dim h As Integer
    ' Get the next available file handle.
    h = FreeFile()
    ' Open the file with desired access mode.
    Select Case mode
        Case omInput: Open Filename For Input As #h
        Case omOutput: Open Filename For Output As #h
        Case omAppend: Open Filename For Append As #h
        Case omBinary: Open Filename For Binary As #h
        Case Else     ' This is the default case.
            Open Filename For Random As #h
    End Select
    ' (Never reaches this point if an error has occurred.)
    m_Handle = h
    m_Filename = Filename
End Sub

' The filename (read-only property)
Property Get Filename() As String
    Filename = m_Filename
End Property

' The file handle (read-only property)
Property Get Handle() As Integer
    Handle = m_Handle
End Property

' Close the file, if still open.
Sub CloseFile()
    If m_Handle Then 
        Close #m_Handle
        m_Handle = 0
    End If
End Sub

Private Sub Class_Terminate()
    ' Force a CloseFile operation when the object goes out of scope.
    CloseFile
End Sub

³oÃþ§O¸Ñ¨M¤j¦h¼Æ¹ï©óÀɮ׳B²zªº°ÝÃD¡A¥]¬Aµo²{¤U¤@­Ó¥i¥ÎªºÀɮ׫ü¼Ð©M¦bÂ÷¶}µ{§Ç¤§«eÃö³¬ÀɮסG

' This routine assumes that the file always exists and can be opened.
' If it's not the case, it raises an error in the client code.
Sub LoadFileIntoTextBox(txt As TextBox, filename As String)
    Dim f As New CFile
    f.OpenFile filename, omInput
    txt.Text = Input$(LOF(f.Handle), f.Handle)
    ' No need to close it before exiting the procedure!
End Sub

½d¨Ò3¡G«Ø¥ßµ{§Çªº¬ö¿ý
¡@

µ§ªÌ¥Î¤@­Ó²³æªºÃþ§O¨Óµ²§ô¥»³¹¸`¡G·í°»¿ù³\¦h¤@¦A©I¥s¨ä¥L±_ª¬µ{§Ç®É¡A±z¥i¯à·|µo²{º¡¦³¥Îªº¡C¦b³o¼Ëªº±¡ªp¤U¡A¨S¦³¥ô¦ó¨Æ±¡¥i¥H¤ñ¹ê»Ú¤@¦ê©I¥sªº¬ö¿ý§ó¦³®Äºû«ù±zªººë¯«¡C¿ò¾Ñ¦a¡A»¡¤ñ°µ®e©ö¡C¦]¬°¦b¨C­Óµ{§Çªº²Ä¤@¦æ¥[¤J Debug.Print ¨Ó°lÂܵ{§Ç¦ó®ÉÂ÷¶}¬O«Ü½ÆÂø¤]¬O¨S¤°»ò·N¸qªº¡A¤×¨ä­Yµ{§Ç¦³³\¦hÂ÷¶}ÂI©Î¨S¦³¥ô¦ó¿ù»~³B²z®É¡CµM¦Ó¡A³o´Æ¤âªº°ÝÃD¥i¥H¥ÎÃþ§O¨Ó¸Ñ¨M¡A¦¹Ãþ§O¥u»Ý­n¤K¦æµ{¦¡½X¡G

' Class CTracer - complete source code.
Private m_procname As String, m_enterTime As Single

Sub Enter(procname As String)
    m_procname = procname: m_enterTime = Timer
    ' Print the log when the procedure is entered.
    Debug.Print "Enter " &; m_procname
End Sub

Private Sub Class_Terminate()
    ' Print the log when the procedure is exited.
    Debug.Print "Exit " &; m_procname &; " - sec. " &; (Timer - m_enterTime)
End Sub

¨Ï¥ÎÃþ§O«Ü²³æ¡A¦]¬°¥u¥²¶·¦b·Q­n°lÂܪº¥ô¦óµ{§Ç«eºÝ¼W¥[¨â¦æ±Ô­z¡G

Sub AnyProcedure()
    Dim t As New Ctracer
    t.Enter "AnyProcedure"
    ' ... Here is the code that does the real thing ...(omitted).
End Sub

CTracerÃþ§OÅã¥Ü¦¹µ{§Ç©Òªá¶OªºÁ`®É¶¡¡A©Ò¥H¥¦¤]¹³­Ó²³æªºProfiler¡C¼W¥[¦¹¯S©Ê¬O¦p¦¹Â²³æ¥H­P©óµLªk§Ü©Ú¡C

¥»³¹¤¶²ÐVisual BasicªºOOP¡A¦ýÁÙ¦³¨ÇÃö©óÃþ§O©Mª«¥óªº¨ä¥L¨Æ±¡¥²¶·ª¾¹D¡A¨Ò¦p¡G¨Æ¥ó¡B¦hºA©Ê¥H¤ÎÄ~©Ó¡C¦b¤U¤@³¹·|´£¨ì³o¨Ç¥DÃD¡Aªþ±a´£¨ì¹ï©ó«Ø¥ß§ó¦nªºVisual BasicÀ³¥Îµ{¦¡©Ò»Ýªº§Þ¥©¡C