Delphi protected published

Published
(1)   可見度與public一樣,
(2)   與public的區別是本區域的成員可以在delphi對象檢查器中出現,而此差別來自RTTI機制
RTTI(Run time type Information)是爲Published製作它允許應用程序動態查詢該類的published的字段、屬性(包括屬性和事件),並且加載類的方法
RTTI啓動條件是有條件的——使“{$M+}”編譯指令的狀態下才能啓動RTTI或它的祖先類以上述狀態編譯,也可以啓動RTTI,然後該類檢查器才能顯示在檢查器中。
(3)   除了RTTI條件限制後,published的屬性也有類型限制
A.序數、字符串(string)、class、interface以及mothod—pointer類,都可以做published的屬性
B.範圍在0-31之間的集合,該集合值必須滿足byte、word或double word類才能做published屬性
C.除了Real類外的所有實數類,都可以做爲published屬性
D.數組類不可以做published屬性
E.所有的成員函數都可以作爲published的事件,然而重載override的函數不可以作爲published事件

F.字段Fieled不能作爲Published的屬性,除非它屬於class或interface類.


Protected

今天在CSDN論壇裏面遊逛,發現這樣的一個帖子《剛纔看到一位武林高手的幾行精妙代碼,百思不得其解,希望各位指點》,本着向各大武林高手學習的態度,我看完了整個帖子,發現內容甚爲經典,記錄於此,作個總結: 


 type
  TStringGridEx = class(TStringGrid);

procedure TForm1.Button1Click(Sender: TObject);
begin
  if TStringGridEx(StringGrid1).RowCount > 5 then
    TStringGridEx(StringGrid1).DeleteRow(5);
end;
---------------------------------------------------------

這是要在StringGrid中刪除一行的代碼。這個問題我搞了2個小時沒有搞定,然後就搜帖子,發現這位高人的代碼,簡直敬佩之情如黃河之水綿綿不絕,運行也通過。但是爲啥TStringGridEx = class(TStringGrid);這個東西就可以有DeleteRow()方法呢?它明明也是繼承的TStringGrid,和TStringGrid是一樣的啊?我頭都大了!希望各位指點!


以上就是樓主提問內容,問題的確奇怪,經過各大掌門的討論得出了一個Delphi特有的保護級成員的應用特點,這應該也是DELPHI獨有的一個面向對象支持特點,總結如下:


1.TForm裏面可以訪問到TStringGridEx的protected成員,因爲它們定義在同一個單元裏面
2.TForm裏面不能訪問到TStringGrid的protected成員,因爲他們不是定義在同一個單元裏面
3.由於TStringGridEx = class(TStringGrid),所以在這裏訪問TStringGridEx的protected成員就相當於訪問TStringGrid的protected成員
4.TStringGridEx只是一箇中介,功能沒有擴展但是把TStringGrid的作用域引入到這個單元中來了,所以TForm可以訪問TStringGrid的protected成員了

掌門一的看法是DELPHI的PROTECTED和PRIVATE成員對於同一UNIT裏面的各種類和對象都是可見的,而且PROTECTED成員可以在友員子類的UNIT中可見,於是TStringGridEx 哪怕只是繼承了TStringGrid沒作任何修改,也令TStringGrid中的PROTECTED成員在TStringGridEx的UNIT中可見(這其中還有一個原因是TStringGrid並不是定義在本UNIT,所以只能通過繼承使本UNIT成爲友員,使TStringGrid的PROTECTED成員開放),問題解決了。我們也從中可以一窺DELPHI的面向對象特點。


 掌門二的評論:在同一個單元定義的兩個類甚至可以互相訪問對方的private成員
雖然方便了開發,但是很能迷惑初學者
甚至感覺不夠嚴謹

不過反正delphi也風光不再了,湊乎用吧
掌門三的評論:沒有完美的東西啊!只有適合的東西哦!
掌門四的評論:protected起來的方法一般是隱藏的,所以直接生成該類的實例是不能引用該方法的,但是在delphi中將位於同一個單元的類自動認爲是友類,可以訪問其protected方法,所以在相應單元中寫一個子類的實現就可以看到protected起來的方法了
 


 個人覺得DELPHI對PROTECTED和PRIVATE在本單元可見的做法既方便了程序員又迷惑了程序員,使得很多以上的例子滿奇怪的,當然這也令程序員增加了許多創造發揮技巧的機會,以上例子就是一個巧妙應用技巧的經典範例,不過個人覺得這些機會還是少一點好。無論如何,可讀性才應該是程序員真正追求的代碼境界,這些奇怪的技巧性代碼,如果我使用其他語言一段時間以後再回來看它,可能怎樣都無法想到問題的解答。不過既然選擇的DELPHI也就選擇了它的缺點,這有點像一對相愛的戀人,選擇了對方也就等於選擇了他的優點和缺點,世上本沒有完美的東西,我們只能適應不完美,追求完美。
(e129)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章