(三)—共享成员


我开始佩服起大李来了,同时对VB.NET充满了好奇与了解的渴望。

“除了全局变量外,还有什么好办法吗?”我迫不急待地想知道结果。

“可以使用共享成员。”大李依然是那么淡淡然,“VB.NET现在是支持真正的面向对象编程,可以继承、使用多态、共享成员和静态成员。共享成员就是在所有类和所定义派生类的实例之间共享的方法、属性、字段和事件。所有使用类创建的对象都可以访问相同的数据、共享实现过程,并且收到相同的激发事件。”

“这么好呀,那怎么实现呢?”我好象又回到了课堂上,满脑都是无知的符号。

“很简单,在Public或Private成员修饰符后加上Shared关键字即可了。Shared关键字指示一个或多个被声明的编程元素将被共享。共享元素不关联于某类或结构的特定实例。可以通过使用类名或结构名称或者类或结构的特定实例的变量名称限定共享元素来访问它们。你来看这段代码

Public Class ShareClass

Public Shared SharedValue As String

Public Shared Sub ShareMethod() 

  MsgBox("This is a shared method.") 

End Sub

End ClassSub

TestShared()

Dim Shared1 As New ShareClass() ' 创建了类的一个实例.

Dim Shared2 As New ShareClass() '创建了类的第二个实例.

Shared1.SharedValue = "Share Value 1"  '给共享字段赋值. 

Shared2.SharedValue = "Share Value 2" ' 重写共享字段的值

ShareClass.ShareMethod() '不用创建实例就可以调用类的方法.

End Sub
 


“有两个要点,一个是共享成员如果是方法或属性,我们不用创建实例就可以直接用‘类名.共享成员’的方法进行调用;第二个要点,共享字段是唯一的,你来说说运行后Shared1.SharesValue的值是多少?”

我头脑里转了两圈,既然说共享字段是唯一的,那么Shared1.SharedValue和Shared2.SharedValue其实对应的是同一个共享字段,所以么,我立刻大声说:“是Share Value 2。因为被Shared2.SharedValue修改了。”

“没错!”大李又一次绽放了会心的微笑,真是对我的最高奖赏。“那你还不动手修改一下你的程序?”

好!说做就做。既然共享属性在其调用的时候是不用实例化的,那么我最好能借助构造一个共享属性来实现。并且要能够判断其实例是否存在或是否被销毁,如果不存在就构造一个新的窗体实例,如果存在就对其进行调用:

Private Shared m_vb6FormDefInstance As Form1

Public Shared Property DefInstance() As Form1

  Get

If m_vb6FormDefInstance Is Nothing OrElse _

   m_vb6FormDefInstance.IsDisposed Then‘判断窗体实例是否存在

  m_vb6FormDefInstance = New Form1()

  End If

  DefInstance = m_vb6FormDefInstance

End Get

Set(ByVal Value As Form1)

m_vb6FormDefInstance = Value

End Set

End Property

 
 


在Form2中也加入相似的代码,只不过把Form1改为Form2。调用它是如此的方便:

Form1中的代码
 Form2中的代码
 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

 Me.Hide()

  Form2.DefInstance.Show()

End Sub
 Private Sub Button1_Click(ByVal sender As _

System.Object, ByVal e As System.EventArgs) _

Handles Button1.Click

  Me.Hide()

  Form1.DefInstance.Show()

 End Sub

Private Sub Form2_Closing(ByVal sender As Object,_

ByVal e As System.ComponentModel.CancelEventArgs) _

 Handles MyBase.Closing

  Form1.DefInstance.Show()

 End Sub
 


赶紧运行一下,不对呀,第一个窗体里文本框改为“Henry的作品”后,再切换仍是不见了?我疑惑地抬头看了看大李。

“你再好好想想,第一次启动的是什么?”大李模糊地说了一句。

“第一次启动的是作为主线程的Form1窗体呀!”我嘟啷着说。

“那么Form1.DefInstance在哪呢?”大李这句话真是惊醒梦中人呀!

我立刻动手:

Module Module1

  Sub Main()

  Application.Run(Form1.DefInstance) 

  End Sub

End Module
 


并把Module1设为启动项目。运行运行……哈哈,一切都如意!我开始喜欢上VB.NET了。

 

本文作者:



相关阅读:
CSS的color颜色使用说明
FreeBSD网站平台建设全过程 第二步
jQuery AJAX实现调用页面后台方法和web服务定义的方法分享
了解linux中Load average负载
循环取值Request.QueryString的用法
jquery text()要注意啦
需要做特殊处理的DOM元素属性的访问
SQL存储过程初探
javascript 全选/反选,取消选择效果
对于Linux系统的几个常见误解
MySQL 最基本的SQL语法/语句
javascript 一个函数对同一元素的多个事件响应
解决OracleDBConsoleorcl不能启动,报错误码
取远程linux主机的流量和tcp连接数
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 CMS SQL jQuery C# C++ java Android IOS oracle MongoDB PostgreSQL SQLite 交通频道 G4722 G1875 G215 G569 G421 G6733 G7577 G8906 G1235 G4916 G7291 G1953 G245 G662 G1570 G6285 G719 G1836 G1346 G4781 G4908 G289 G6781 G9290 G7358 G1928 G1815 G325 G132 G4901 G6012 G6290 G7131 G5367 G184 G151 G5303 G1136 G6481 G7028 G575 G1744 G7660 G7693 G2344 G4937 G1234 G1814 G6252 G1492 G253 G2926 G883 G9275 G1231 G556 G241 G1306 G7646 G8103 G600 G1858 G9678 G6160 G7156 G825 G1125 G7249 G1809 G1350 G432 G9466 G7067 G785 G6404 G4663 G7008 G150 G823 G1514 G7529 G1201 G2353 G205 G7629 G9409 G6147 G677 G390 G8016 G9239 G456 G828 G8045 G491 G7145 G397 G7012 G1021 G6482 G2322 G7264 G1301 G9247 G96 G1294 G7133 G4824 G7005 G1653 G5307 G1213 G822 G4837 G1422 G411 G6227 G1571 G359 G1882 G6074 G7678 G21 G7077 G1272 G8918 G9645 G461 G1254 G1846 G8021 G7303 G1104 G76 G82 G621 G218 G8533 G2341 G8543 G555 G8013 G4802 G1364 G1153 G1342 G1861 G8905 G590 G4780 G668 G9261 G1304 G1638 G1395 G2914 G8003 G7158 G1833 G1873 G8128 G1856 G1841 G8709 G7346 G4612 G2103 G835 G8712 G381 G7240 G8932 G507 G29 G4054 G6273 G6752 G426 G211 G9473 G7119 G2333 G1567 G6153 G360 G4011 G5301 G7648 G8010 G8015 G6706 G614 G423 G8557 G9465 G72 G6018 G8901 G7030 G123

丹东 云霄 辽中 德阳 克拉玛依 惠山 招远 昭通 铁岭西 延吉西 军粮城北 定西 晋中 许昌东 郫县 诏安 七台河 高碑店东 南昌 延安 敦化 铜陵北 嵩明 鲘门 扬中 龙里北 舟山 洛阳 运城北 鞍山 西昌 邵阳北 绍兴 白山 三明 肇东 陵水 衡山西 嘉善 宜都 泰兴 泉州 汉口 东胜西 昌图西 锦州南 安阳东 怀化 黄南 亚龙湾 扬州 温州 南翔北 福安 金山北 永川东 安达 曲阜东 郑州西 天门 绍兴北 涪陵北 阳泉北 三亚 葫芦岛北 徐州 阳江 辽源 新泰 阿坝 孝感北 三穗 金寨 保山 高安 安阳 牟平 西双版纳 信阳 繁昌西 哈尔滨北 达州 新余 沈阳南 四平 扶余北 伊宁 郴州西 济源 水家湖 民权北 福鼎 如皋 奉化 全州南 安庆 太姥山 武汉 乐清 皮口 武昌 茂名 邯郸 资阳 马鞍山 三水南 泰安 包头东 衡阳东 南丰 仙桃西 安吉 罗源 山海关 平湖 惠州 资阳北 淄博 丹阳 莱州 巴东 关岭 盐城 锦州 格尔木 益阳 大英东 吉林 湛江 临安 襄汾西 渑池南 当涂东 辽阳 徐水 贺州 韶关 光明城 邯郸东 普安县 南江口 铜川 五龙背东 张家港 烟台南 萍乡北 青堆 长乐 江门 台州 衡水 湘潭北 闽清北 高邑西 盖州西 石柱县 潮汕 肇庆 泰康 邵东 湖州 余姚 平凉 宜宾 增城 沧州 都匀 防城港 鹰潭北 海东西 福田 余姚北 岳池 广州北 南安 蓬莱 瓦房店西 李石寨 葛店南 海安 无锡东 上饶 通辽 四会 桂林西 砀山南 兰州 滨海 龙口 绅坊 莱西 石林西 深圳 大连北 成都 上海西 孝感 杏树屯 德清 嘉兴

Copyright © 2016 phpStudy |