| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 708 人关注过本帖, 1 人收藏
标题:簡論類與對象——並不僅限於VFP
取消只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏(1)
 问题点数:0 回复次数:4 
簡論類與對象——並不僅限於VFP
面嚮對象編程,“類”與“對象”是最基本的概念。所謂“類”,相當於設計藍圖,是關於某種事物的共性規定,包括屬性與行爲。比如“馬”,是一種類,我們都知道這種類屬有什麽特徵,一講馬,頭腦中就知道這種生物應該有什麽、如何判別是不是馬、馬的基本特性是什麽等等。但是,世界上沒有“馬”,白馬非馬,衹有各種各樣具體的馬實體,沒有對應抽象馬概念的實體,馬類是人腦思維物。在這裏,抽象的馬就是類,具體的馬才是對象。類與對象不是一回事,對象是從類藍圖中製造出來的實物,在製造任何一個實物出來之前,所有的類定義都是紙上談兵。

在編程中,編寫類定義代碼,衹是設計一份藍圖,但並沒有製造實物對象,也就是說,程序中沒有關於這個類的具體對象,無法使用。類代碼屬於程序内核,是程序代碼區中的一部分,隨著程序加載入内存而加載,正如加載一系列函數,但若沒調用,是不起作用的。因此,不存在從内存中釋放類的問題。


[此贴子已经被作者于2015-11-21 20:34编辑过]

收到的鲜花
  • tlliqi2015-11-22 11:04 送鲜花  50朵   附言:好教材,楼主辛苦了
搜索更多相关主题的帖子: 如何 健康 
2015-11-21 11:49
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
實體從創建對象開始。在VFP中,創建對象用CreateObject()函數,程序衹有在執行這條指令時,才真正地從内存創建出一個對象。舉個例子,代碼
Form1 = CreateObject("Form")

從VFP(内置)基本的Form類(也可以是Form的派生類,或別的類、自定義類)中創建一個以引用變量Form1命名的對象。Form是類,Form1是對象。

CreateObject()是動態執行時創建對象,若是可視化對象,那麽此時它還是不可見的(可視是“是否可以看見”的意思,不是什麽拖拉法),要不要讓它可視,以及什麽時候可視,由程序員自己決定。設計爲可視化的類,它應該有一個叫Visible的屬性,置此屬性爲真,則立馬可見,置假,立馬消隱(並非卸載對象)。不管對象是否可見,它的行爲仍生效,可以響應事件,可以通過代碼調用指令執行方法,這一切,都與是否可視無關。這個機制,賦予了我們動態呈現和消隱對象的能力,比如在寫彈出式菜單時,就很有用。

卸載對象的方法,是Release Form1,即釋放對象名。Release實際上是從内存中卸載數據的方法,任何數據均可用此指令卸載,普通的變量(對象的引用名就是變量)也可以。可視的對象,若執行了Release,那麽它肯定不再可視,因爲它徹底從(程序的)世界中消失了。

這是動態行爲。在SCX中拖拉出來的控件,以及在類定義代碼中ADD OBJECT設計的對象,都是靜態的,一經創建此類的對象實體,就天生地可視,除非你設計之後明確再書寫其Visible屬性爲假。在表單設計器中拖拉的控件,生成的SCX程序集,實際上就是這個設計器替你書寫ADD OBJECT指令,兩者是完全一樣的——這就是拖放動作的背後動作,設計器是一個用VFP寫出來的應用程序,它感應你的拖放事件然後生成一段指令文本寫到代碼區的恰當位置,自己用代碼寫,可以不用設計器代勞,這個技能才是你自己的,是學寫程序,不是學怎麽用生成器,到生成器不能滿足特殊需求的時候,你就不會自己寫了,但反過來,你會寫代碼,就一定也會用生成器。最該學什麽,其實是很明白的。

授人以渔,不授人以鱼。
2015-11-21 21:02
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
面嚮對象的系統機制:類代碼屬於程序内核,一經設計好,是不能更改的。在用戶區,系統負責維護一張對象表,每當創建一個對象,就在表中添加一條記錄(所謂的“句柄”),此表每筆記錄都可以填寫該類所允許的各種屬性,以及指向具體方法代碼的函數指針,在類中設計好的方法、事件代碼,不論創建多少對象實體,都衹有一份。銷毀或釋放對象,就是從表中抹去此條記錄。所以,這種機制創建對象,速度是很快的,其實不必在内存中開闢多少空間。

Windows系統是用面嚮對象設計出來的程序,也是這般,所以系統的内核佔用很大的空間,就是把類的固定代碼都放在哪裏,反而具體程序用不了多少内存,這就是它可以同時開啓運行同一程序多個副本的原因,而且開啓再多副本,也不是把整個程序空間相乘那樣算,這些副本(對象)實際上衹用了屬性値那麽點空間。32位的Windows系統,最大訪問内存空間是4GB,它分配自身佔用2GB,留下2GB給用戶,這就是VFP處理文件最大是2GB的原因,因爲已經是操作系統所給的極限空間了。雖然Windows可以修改設置,壓縮内核空間,把用戶内存讓到3GB,但其代價是系統反應速度變慢,道理也在此。有人總是指責Windows系統内核佔用空間大,其實是不知道這個道理,大多數程序會用到的内核代碼不在啓動時加載到内存,那麽衹能在運行相關程序時臨時再從磁盤加載,那也是影響程序啓動速度,到時也更佔内存。Windows XP/7啓動時佔用内存的確比Windows 8/10少,但我實踐觀察過,在長時間使用系統(即不關機反復使用多個程序)後,内存佔用量大得可怕:我的機器安裝8G内存,使用64位Win7時經常出現佔用内存高達6G的情況,甚至導致卡頓的,但在Win8/10的時候,同樣的用法,絕大多數時候都穩定在2.9G左右,僅有兩三次是超過4G的,但從來沒有遇到佔用達6-7G的情況。

用VFP調用Excel的COM組件,之所以出現某些看起來是共享造成的問題,也是這個原因。

授人以渔,不授人以鱼。
2015-11-22 00:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
VFP是使用系統内核的,衹要在不同系統中觀察一下它的Form窗體就知道了,在XP、Win7、Win8、Win10等系統下,它的Form都跟隨系統窗體的風格,連標題欄也是跟著Win7毛玻璃的,在XP下卻沒有,看看那些邊框綫和四個角。明白了上面所說的道理,自然知道爲什麽會這樣。也就是說,在VFP中創建一個Form,根本就不需要加載什麽另外的代碼,它直接就使用早已在内存中的系統類代碼,衹是填寫了一下相應的數據而已,比如標題欄文字Caption,其實就是一個字符串傳遞給内核類代碼的Title變量,讓對方輸出。本質上,絕大多數運行在Windows系統中的程序,都是使用同一份Form類,除非某些軟件商硬要跳過,自己編寫獨特的窗口模式,比如Delphi那樣的商家,就喜歡這樣。其實,這就是Windows所開啓的統一界面的技術内幕,這樣做出來的東西,當然有一致的外觀和表現了。

這才是面嚮對象的本質,不是什麽可視化就是面嚮對象。面嚮對象編程問世的時候,還是DOS時代,像C++那樣的語言,也都是在非可視的開發環境使用的。本來,html的編寫,也是可視化的,直接在瀏覽器中就能看到效果了,不用什麽拖拉,但html顯然不是面嚮對象的。所有解釋型的編程語言,其實都可以可視化。

[此贴子已经被作者于2015-11-22 00:45编辑过]


授人以渔,不授人以鱼。
2015-11-22 00:36
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
港臺是用Big5碼的,不是看字體。

授人以渔,不授人以鱼。
2015-11-23 12:51
快速回复:簡論類與對象——並不僅限於VFP
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019278 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved