6. Ãþ§O»Pª«¥ó
´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¥DnªºÀ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
»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¡CY¦³¤@Ó±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¤@ÓÃþ§Onªá¶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¡CY·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¥un±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¥ýÁ׶}¸Ô²Óªº²Ó¸`¡CY´¿¸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
Á`¦Ó¨¥¤§¡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®ÄªºÈµ¹¨äÄÝ©Ê¡Cn¤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ªºÈµ¹¥¦¡CYµ{¦¡½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ªÌµ{¦¡½Xn¨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¦]¦¹¤]³\·Qn³]p¥X¤@Ó§Ö³t²³æ¦C¥X¥þ¦Wªº¤èªk¡Cn¸Ñ¨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¸Ü»¡¡AY¦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¥Hu¨ÓÀ³¥Î¦¹¤@³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ÁÙ¦³¥Ļ¹¾ãªº»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·Qn«ü©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²{¦bn°õ¦æ¨ì¥Ø«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¥un¶}µÛ³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
°ßŪÄÝ©Ê
¡@
Á¿¨ì·Qn¦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¯à¬Æ¦Ü·Qn«Ø¥ß¤@Ó°ß¼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¡CY»Ýn¤@Ó°ßŪÄÝ©Ê¡A§Ú¤ñ¸û³ßÅw«Ø¥ß¤@Ó¥i±µ¨üȧ@¬°°Ñ¼Æªº¤èªk¡]¦b¦¹¥i¬° SetPassword¡^¡C
¼g¤@¦¸¡þŪ¦h¦¸ªºÄÝ©Ê
¡@
¼g¤@¦¸¡þŪ¦h¦¸¡]Write-once/read-many¡^Äݩʤñ°_¯Âºéªº°ß¼gÄÝ©Ên¨Óªº¦³½ì¥B¦³¥Î¡C¨Ò¦p¡A¥ý«e´yzªº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
»¡©ú
·í±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¤£·Qn¨î¦Û¤v¥u¦³¤@Ó¶µ¥Ø¡C²Ä¤@ӸѨM¤èªk¬O¨Ï¥Î¤@Ó°}¦C¦r¦ê¡C¿ò¾Ñ¦a¡AY±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«Ü¤Ö³Qn¨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°²³]·Qn§â©Ò¦³±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¦]¦¹¡AY³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¸Ñ¡CY±z±N±qVisual Basic 4Âà¦V²Ä¤ª©©Î²Ä¤»ª©¡A¤£±o¤£´£¨¾¡C
µL½×¦p¦ó¡A³o¸Ì¦³¥t¤@Ó¥¼³zÅSªº¨Æ¥ó¡C¨ì¥Ø«e¬°¤î§Ú»¡Á¿ªº¬O·í±qÃþ§O¥~³¡°Ñ·Ó¤½¶}ÅܼƩҵo¥Íªº¨Æ¡CY±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ÁôÂ桵{§Çªº¶Ç¦^È¡CY·Qn±qÃþ§O¥~³¡±Nµ{¦¡½X²¾¨ìÃþ§O¤º³¡¡]©ÎªÌ¬Û¤Ï¡^¡A³o¤@ÂI¬O«nªº¡A¦]¬°¥²¶··Ç³Æ³B²z¹³³o¼ËÃø®»ºNªºÄ³ÃD¡C
ª`·N
³Ì«á¤@ÂI»Ýª`·Nªº¡GY¦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¤£·Qn¨C¦¸¥Î¤áºÝµ{¦¡§@¤@Ón¨D®É«Kpºâ¤@¦¸¡C´«¥y¸Ü»¡¡A±z¤£·Qn¦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«·spºâ¡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 µ{§Ç¤¤«·spºâ m_ReverseName È¡A¦ý¨º·|¯}Ãa§ÚÌ¥Dnªº¥Ø¼Ð¡]Áק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¦¨¦¹¥Ø¼Ðªº¥Dn¤èª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¦ý·í¥BYÃþ§OÅܦ¨¤½¶}¥B±q¥~±¥i¶i¤J¥¦®É±NÅܦ¨«nªº¡A²Ä16³¹·|»¡¨ì¡C¦b¼Ð·ÇEXE±M®×¡A¤Íµ½©M¤½¶}¬O¬Û¦Pªº¡F¨Ï¥Î«eªÌ¨Ã¨SÃö«Y¡A¥BYµ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´ú¡AY±N¥LÌ»E¶°¦bBAS¼Ò²Õ¤º¡A¨Ã¥Bµ¹³o¼Ò²Õ¤@Ó²©öªº¦WºÙ¡A¨Ò¦p Class ©Î Factory¡]©êºp¡AµLªk¨Ï¥Î New¡^¡CµM«á·í»Ýn¿é¤J«ØºcªÌ¦WºÙ®É¡A¥un¥´¤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Ó¥\¯à¡AY±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µ¥µ¥¡^¡CY¬Ù²¤²Ä¤@ÓÈ¡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
¹Ï6-4 ¦b¤@Ó¤½¶}ªºÃþ§O¤¤¨ÃµLªk¨Ï¥Î Enum È¡AY Enum °Ï¶ô¦ì©óªí³æ¼Ò²Õ¡B¤@Ó¨p¦³Ãþ§O¡A©Î¤@ӼзǪºBAS¼Ò²Õ¤º®É¡C |
³Ì«á¤@ÂI¤×¨ä«n¡A§Ú±j¯P«Øij±z¦³Ó¹ï©Ò¦³«ü©ú±`¼Æ²£¥Í°ß¤@¦WºÙªº¤èªk¡CY¥¢±Ñªº¸Ü¡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¤@¨Ç´yz©Ê¸ê°T¦b4¦ì¤¸²Õªº°O¾ÐÅé¡A±z¤£¸Ó§Ñ°O¿ð¦¥²¶·¨ú¥X©M¸ÑĶ¦¹¸ê°T¡A¥B¦³¨Ç®ÉԬƦܦb±zªº¨Ï¥ÎªÌ±«eÅã¥Ü¥¦¡C°ò©ó¦¹¡Aµ§ªÌ³q±`·s¼W¤@Ó°ßŪÄݩʵ¹µ§ªÌªºÃþ§O¡A¦¹ÄݩʶǦ^«ü©úÄݩʪº´yz¡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Á|¨Ò¨Ó»¡¡AYµ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¡AY¤£·Qn¤§«áªá¶O¤Ó¦h®É¶¡¨Ó°»¿ùµ{¦¡½Xªº¸Ü¡AÀ³n±`¥Î¦¹ºØ¤è¦¡¡C
³o¸Ì¦³Ó²³æªº§Þ¥©¡AÅý±z¦w¥þ¦a¼W¥[¤@Ó·sªº±`¼Æ¡AµL¶·»Ý¦b¬Û¹ïªº Property Set µ{§Ç¤¤×¥¿ÅçÃÒµ{¦¡½X¡C¥un¦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È¡CY¼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¥BY¬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¨º»ò²³æ¡CY³Ì¤º³¡ªºÃþ§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À³¸Ó¹ï¦Û¤vt³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°²³]·Qn¹ê§@ CurrentAddress ÄÝ©Ê¡A¦ý·Qn«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·Qn±±¨î¤¤¹ê»Ú¤À¬£µ¹¦¹Äݩʪºª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¦Ó¨¥¡An½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·QnÁA¸Ñ³o¬O¦ó®Éµo¥Íªº¡C¥un¥Î¤@¹ï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Â^¨ú¶Ç¦^È¡AY¤Þ¤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
¹Ï6-6 ±qª«¥óÂsÄý¾¹¿ï¾ÜÄݩʿﶵ |
¹Ï6-7 ®i¶}ªºProcedure Attributes¹ï¸Ü®Ø |
¤@ÓÃþ§O¤£¯à¦³¦hÓ¹w³]ÄݩʩΤèªk¡CY¹Á¸Õ«Ø¥ß²Ä¤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§Ú·Qnĵ¥Ü±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¨Æ¡CYÃþ§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¬°§Ú̬On«ü©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¸Un°O±o³o¥ó¨Æ¡C¥BY¨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¥Í¡AY¥Ø¼ÐÄݩʤw¸g³Q«Å§i¬°¤@Óauto-instancing¡A¦]¬°¦p¦¹Visual Basic·|«Ø¥ß¤@Óª«¥ó¡C³o¶È¬O¶i¤@¨BªºÃÒ©ú¡Aauto-instancingª«¥óÀ³¸ÓÁ`¬On³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¡AY¥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¥~¸ÑÄÀªº¡CDescription ¥i¥H¥Î¤å¦r¨Ó´yz©w¸q¦bÃþ§O¼Ò²ÕªºÄÝ©Ê©M¤èªk¡CµM«á³o´yz·|¥X²{¦bª«¥óÂsÄý¾¹¡A¨Ã´£¨ÑÃþ§O¼Ò²Õªº¨Ï¥ÎªÌ¦³Ãö¨CÓ¦¨û¦p¦ó¨Ï¥Î¡C´yz¤å¦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¨Æ¥óµ¥µ¥ªº´yz¡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·í±zn½Æ»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¡CY±z·Qn¦bÃþ§O¼Ò²Õ¤¤²¾°Êµ{¦¡½X¦Ó¤£¿ò¥¢©Ò¦³Áô©Ê³s±µªºÄݩʮɡAº¥ý¥²¶·½Æ»s·Qn©ñ¸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¨Æ¹ê¬OY«Ø¥ß¨âÓ«ü¦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
³Ì«á´£¨ì¤@Ó°ÝÃ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¨Ï¥Î©Ò¿×ªºreferencep¼Æ¾¹¨Ó¸Ñ¨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¡AY±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
³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
¨ú±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ªº°Ê§@¡CYÃþ§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
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¡CY¦¹ÄݩʩΤèª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ªí¡CY½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¤ä´©©Ò·Qnªº¤èªk¨S¦³¥ô¦ó«OÃÒ¡CY¹ê»Ú¤Wªºª«¥ó¤£¤ä´©¦¹¤èªk¡A°õ¦æ´Á¶¡ªº¿ù»~±N·|µo¥Í¡CY¦³Ó³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¡CY¦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¥[®Ä²vt¸ü¡A¦h¼Æ±¡ªp¤¤´X¥GµLªkt²ü¡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ªº¤@Ó¡CYª«¥ó¦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¬Û¹ï©ó¸ê®Æ°Ï¶ôªºreferencep¼Æ¾¹©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ª«¥ó¤¤¤ÀÂ÷¥¦¡CYP1¬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ºâ¤¸ªº¹ê»Ú¦ì§}¡AY²Å¦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§@¡CY¨S¦³¡AVisual Basic±N·|©Úµ´½sĶ³oµ{¦¡½X¡C·í·Qn¼¶¼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×¥¿©Ò¦³ª«¥óªºÄÝ©Ê¡CYnÁק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»¼´î¡CY¥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Àò¨úªºµøµ¡¸ê·½¡CY·Qn¨Ïª«¥óÄÝ©Ê«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¬OY¦]¬°¿ù»~¦Ó¾É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·Qn°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¦¹Â²³æ¥HP©óµ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