TStringGridEx = class(TStringGrid);
procedure TForm1.Button1Click(Sender: TObject);
begin
if TStringGridEx(StringGrid1).RowCount > 5 then
TStringGridEx(StringGrid1).DeleteRow(5);
end;
---------------------------------------------------------
這是要在StringGrid中刪除一行的代碼。這個(gè)問題我搞了2個(gè)小時(shí)沒有搞定,然后就搜帖子,發(fā)現(xiàn)這位高人的代碼,簡(jiǎn)直敬佩之情如黃河之水綿綿不絕,運(yùn)行也通過(guò)。但是為啥TStringGridEx = class(TStringGrid);這個(gè)東西就可以有DeleteRow()方法呢?它明明也是繼承的TStringGrid,和TStringGrid是一樣的???我頭都大了!希望各位指點(diǎn)!
--------------------------------------------------------------------------------
以上就是樓主提問內(nèi)容,問題的確奇怪,經(jīng)過(guò)各大掌門的討論得出了一個(gè)Delphi特有的保護(hù)級(jí)成員的應(yīng)用特點(diǎn),這應(yīng)該也是DELPHI獨(dú)有的一個(gè)面向?qū)ο笾С痔攸c(diǎn),總結(jié)如下:
--------------------------------------------------------------------------------
1.TForm里面可以訪問到TStringGridEx的protected成員,因?yàn)樗鼈兌x在同一個(gè)單元里面
2.TForm里面不能訪問到TStringGrid的protected成員,因?yàn)樗麄儾皇嵌x在同一個(gè)單元里面
3.由于TStringGridEx = class(TStringGrid),所以在這里訪問TStringGridEx的protected成員就相當(dāng)于訪問TStringGrid的protected成員
4.TStringGridEx只是一個(gè)中介,功能沒有擴(kuò)展但是把TStringGrid的作用域引入到這個(gè)單元中來(lái)了,所以TForm可以訪問TStringGrid的protected成員了
掌門一的看法是DELPHI的PROTECTED和PRIVATE成員對(duì)于同一UNIT里面的各種類和對(duì)象都是可見的,而且PROTECTED成員可以在友員子類的UNIT中可見,于是TStringGridEx 哪怕只是繼承了TStringGrid沒作任何修改,也令TStringGrid中的PROTECTED成員在TStringGridEx的UNIT中可見(這其中還有一個(gè)原因是TStringGrid并不是定義在本UNIT,所以只能通過(guò)繼承使本UNIT成為友員,使TStringGrid的PROTECTED成員開放),問題解決了。我們也從中可以一窺DELPHI的面向?qū)ο筇攸c(diǎn)。
--------------------------------------------------------------------------------
掌門二的評(píng)論:在同一個(gè)單元定義的兩個(gè)類甚至可以互相訪問對(duì)方的private成員
雖然方便了開發(fā),但是很能迷惑初學(xué)者
甚至感覺不夠嚴(yán)謹(jǐn)
不過(guò)反正delphi也風(fēng)光不再了,湊乎用吧
掌門三的評(píng)論:沒有完美的東西??!只有適合的東西哦!
掌門四的評(píng)論:protected起來(lái)的方法一般是隱藏的,所以直接生成該類的實(shí)例是不能引用該方法的,但是在delphi中將位于同一個(gè)單元的類自動(dòng)認(rèn)為是友類,可以訪問其protected方法,所以在相應(yīng)單元中寫一個(gè)子類的實(shí)現(xiàn)就可以看到protected起來(lái)的方法了
--------------------------------------------------------------------------------
個(gè)人覺得DELPHI對(duì)PROTECTED和PRIVATE在本單元可見的做法既方便了程序員又迷惑了程序員,使得很多以上的例子滿奇怪的,當(dāng)然這也令程序員增加了許多創(chuàng)造發(fā)揮技巧的機(jī)會(huì),以上例子就是一個(gè)巧妙應(yīng)用技巧的經(jīng)典范例,不過(guò)個(gè)人覺得這些機(jī)會(huì)還是少一點(diǎn)好。無(wú)論如何,可讀性才應(yīng)該是程序員真正追求的代碼境界,這些奇怪的技巧性代碼,如果我使用其他語(yǔ)言一段時(shí)間以后再回來(lái)看它,可能怎樣都無(wú)法想到問題的解答。不過(guò)既然選擇的DELPHI也就選擇了它的缺點(diǎn),這有點(diǎn)像一對(duì)相愛的戀人,選擇了對(duì)方也就等于選擇了他的優(yōu)點(diǎn)和缺點(diǎn),世上本沒有完美的東西,我們只能適應(yīng)不完美,追求完美。
procedure TForm1.Button1Click(Sender: TObject);
begin
if TStringGridEx(StringGrid1).RowCount > 5 then
TStringGridEx(StringGrid1).DeleteRow(5);
end;
---------------------------------------------------------
這是要在StringGrid中刪除一行的代碼。這個(gè)問題我搞了2個(gè)小時(shí)沒有搞定,然后就搜帖子,發(fā)現(xiàn)這位高人的代碼,簡(jiǎn)直敬佩之情如黃河之水綿綿不絕,運(yùn)行也通過(guò)。但是為啥TStringGridEx = class(TStringGrid);這個(gè)東西就可以有DeleteRow()方法呢?它明明也是繼承的TStringGrid,和TStringGrid是一樣的???我頭都大了!希望各位指點(diǎn)!
--------------------------------------------------------------------------------
以上就是樓主提問內(nèi)容,問題的確奇怪,經(jīng)過(guò)各大掌門的討論得出了一個(gè)Delphi特有的保護(hù)級(jí)成員的應(yīng)用特點(diǎn),這應(yīng)該也是DELPHI獨(dú)有的一個(gè)面向?qū)ο笾С痔攸c(diǎn),總結(jié)如下:
--------------------------------------------------------------------------------
1.TForm里面可以訪問到TStringGridEx的protected成員,因?yàn)樗鼈兌x在同一個(gè)單元里面
2.TForm里面不能訪問到TStringGrid的protected成員,因?yàn)樗麄儾皇嵌x在同一個(gè)單元里面
3.由于TStringGridEx = class(TStringGrid),所以在這里訪問TStringGridEx的protected成員就相當(dāng)于訪問TStringGrid的protected成員
4.TStringGridEx只是一個(gè)中介,功能沒有擴(kuò)展但是把TStringGrid的作用域引入到這個(gè)單元中來(lái)了,所以TForm可以訪問TStringGrid的protected成員了
掌門一的看法是DELPHI的PROTECTED和PRIVATE成員對(duì)于同一UNIT里面的各種類和對(duì)象都是可見的,而且PROTECTED成員可以在友員子類的UNIT中可見,于是TStringGridEx 哪怕只是繼承了TStringGrid沒作任何修改,也令TStringGrid中的PROTECTED成員在TStringGridEx的UNIT中可見(這其中還有一個(gè)原因是TStringGrid并不是定義在本UNIT,所以只能通過(guò)繼承使本UNIT成為友員,使TStringGrid的PROTECTED成員開放),問題解決了。我們也從中可以一窺DELPHI的面向?qū)ο筇攸c(diǎn)。
--------------------------------------------------------------------------------
掌門二的評(píng)論:在同一個(gè)單元定義的兩個(gè)類甚至可以互相訪問對(duì)方的private成員
雖然方便了開發(fā),但是很能迷惑初學(xué)者
甚至感覺不夠嚴(yán)謹(jǐn)
不過(guò)反正delphi也風(fēng)光不再了,湊乎用吧
掌門三的評(píng)論:沒有完美的東西??!只有適合的東西哦!
掌門四的評(píng)論:protected起來(lái)的方法一般是隱藏的,所以直接生成該類的實(shí)例是不能引用該方法的,但是在delphi中將位于同一個(gè)單元的類自動(dòng)認(rèn)為是友類,可以訪問其protected方法,所以在相應(yīng)單元中寫一個(gè)子類的實(shí)現(xiàn)就可以看到protected起來(lái)的方法了
--------------------------------------------------------------------------------
個(gè)人覺得DELPHI對(duì)PROTECTED和PRIVATE在本單元可見的做法既方便了程序員又迷惑了程序員,使得很多以上的例子滿奇怪的,當(dāng)然這也令程序員增加了許多創(chuàng)造發(fā)揮技巧的機(jī)會(huì),以上例子就是一個(gè)巧妙應(yīng)用技巧的經(jīng)典范例,不過(guò)個(gè)人覺得這些機(jī)會(huì)還是少一點(diǎn)好。無(wú)論如何,可讀性才應(yīng)該是程序員真正追求的代碼境界,這些奇怪的技巧性代碼,如果我使用其他語(yǔ)言一段時(shí)間以后再回來(lái)看它,可能怎樣都無(wú)法想到問題的解答。不過(guò)既然選擇的DELPHI也就選擇了它的缺點(diǎn),這有點(diǎn)像一對(duì)相愛的戀人,選擇了對(duì)方也就等于選擇了他的優(yōu)點(diǎn)和缺點(diǎn),世上本沒有完美的東西,我們只能適應(yīng)不完美,追求完美。

