日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

苛评VCL: 接口与TObject

發(fā)布時(shí)間:2025/3/15 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 苛评VCL: 接口与TObject 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在李維的《inside VCL》中詳細(xì)描述了VCL中TObject的地位。是的Borland的工程師們有心將Delphi語(yǔ)言做成pure language。所以你幾乎可以看到TObject的所有pure pascal的實(shí)現(xiàn)。

更重要的,你應(yīng)該會(huì)發(fā)現(xiàn)。Delphi將代碼的所有運(yùn)行機(jī)制都暴露在我們面前。這也就是Delphi的TObject和C++中的Object以及C#的Object有很大不同的地方。

Delphi將整個(gè)語(yǔ)言的機(jī)制都在TObject上實(shí)現(xiàn)了。消息機(jī)制、接口機(jī)制、面向?qū)ο髾C(jī)制(多態(tài))等等你都可以從TObject的實(shí)現(xiàn)代碼中看到運(yùn)行的全部流程。

不管TObject如何優(yōu)秀,可是TObject正如Borland一樣,在它身上總是看到受制于MS的影子。特別是接口機(jī)制。我有兩點(diǎn)認(rèn)為TObject的設(shè)計(jì)不好。

  • 對(duì)象指針和接口指針并不是同一個(gè)地址
  • 對(duì)象和接口不可以混用
  • 先說(shuō)說(shuō)我第一個(gè)不滿意的地方。說(shuō)是第一,并不表示是“最”的意思。只是代表“最先”的意思。

    在Delphi的TObject中,類在實(shí)現(xiàn)了接口之后,其創(chuàng)建的實(shí)例中,對(duì)象指針和接口指針并不是同一個(gè)地址。這個(gè)可能大家沒(méi)有注意到,但是主要通過(guò)簡(jiǎn)單的例子(取兩個(gè)指針的地址)就可以發(fā)現(xiàn)這個(gè)現(xiàn)象。

    你可能不會(huì)在意這個(gè)差異。是的,其實(shí)也沒(méi)什么,不是同一個(gè)地址,代碼照樣可以工作。在對(duì)象的內(nèi)存實(shí)例模型中,接口的指針直接存儲(chǔ)在屬性后面(如果存在繼承,可能會(huì)出現(xiàn)交錯(cuò)的)。因?yàn)門Object設(shè)計(jì)的時(shí)候,兩個(gè)地址不在一起,那么就存在兩個(gè)問(wèn)題:

    • 如果從對(duì)象轉(zhuǎn)換到接口
    • 如何從接口轉(zhuǎn)換到對(duì)象

    稍微知道對(duì)象模型的人,就應(yīng)該知道對(duì)象調(diào)用虛擬方法表的過(guò)程。只有對(duì)象指針可以指向VMT。另外,在接口訪問(wèn)方法的實(shí)現(xiàn)代碼的時(shí)候,也需要傳入對(duì)象指針。這是為什么?我們知道,一個(gè)對(duì)象的方法中,有一個(gè)隱含的指針,我們一般稱它為Self指針。只要不是class function,那么這個(gè)Self指針就是指向?qū)ο髮?shí)例的指針。所以在代碼的調(diào)用過(guò)程中,必然有這個(gè)轉(zhuǎn)換。

    TObject提供的AS操作,可以完成第1個(gè)轉(zhuǎn)換,但是可惜的是,TObject并沒(méi)有提供一個(gè)公開(kāi)的方法來(lái)負(fù)責(zé)第2個(gè)轉(zhuǎn)換。這是我認(rèn)為TObject在這方面設(shè)計(jì)不好的原因。(JCL代碼庫(kù)中有第2個(gè)轉(zhuǎn)換的代碼)

    第二個(gè)我不滿意的地方就是TObject在生存期管理上,沒(méi)有做到和接口一致。我相信這也是許多使用Delphi接口的同志們一致的想法。雖然我們現(xiàn)在看到Java和C#都已經(jīng)做到這點(diǎn),可不能不指出的是,在Delphi中,對(duì)象和接口不可以混用!

    我并不是奢求TObject的生存期可以自管理。畢竟,我還是習(xí)慣了“誰(shuí)創(chuàng)建誰(shuí)釋放”的規(guī)則。可是一旦到了接口和對(duì)象混合使用的時(shí)候,就發(fā)生了問(wèn)題。

    這雖然可以解釋為接口是Delphi為了迎合COM而后加上的。我們今天卻應(yīng)該來(lái)設(shè)計(jì)一下一種規(guī)則,來(lái)解決接口混用的問(wèn)題。我認(rèn)為可以有一種簡(jiǎn)單的方式:TObject在Free的時(shí)候,發(fā)現(xiàn)其接口引用計(jì)數(shù)不為0的時(shí)候,不會(huì)Destroy。

    目前我們無(wú)法做到這點(diǎn),這是因?yàn)镈estroy是Delphi默認(rèn)做的,也就是說(shuō),只要調(diào)用了Free方法,Destroy必然發(fā)生。我們無(wú)法完美地改變這個(gè)現(xiàn)實(shí)。也正因?yàn)榇?#xff0c;我才認(rèn)為必須在設(shè)計(jì)TObject的時(shí)候,將這個(gè)考慮進(jìn)去!

    OK。嘗試重新審視VCL中的各個(gè)基礎(chǔ)類,其實(shí)有點(diǎn)大膽。所以用“苛評(píng)”這個(gè)詞來(lái)做標(biāo)題,表明這完全是我的苛刻,VCL的設(shè)計(jì)是非常棒的。不過(guò)也算是我使用6年Delphi的一點(diǎn)回報(bào)吧。以后還會(huì)繼續(xù)苛評(píng)其他類。希望大家繼續(xù)關(guān)注。

    轉(zhuǎn)載于:https://www.cnblogs.com/ohmyjava/archive/2007/02/02/2141942.html

    總結(jié)

    以上是生活随笔為你收集整理的苛评VCL: 接口与TObject的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。