2012-03-06 73 views
6

我們有一個項目充滿了今天在拉撒路和德爾福工作的定製組件。Delphi和Lazarus(FPC)的接口實現有什麼區別?

我在想它的代碼界面,但我不太熟悉它們。我想知道的是:Delphi和Lazarus接口的實現細節有哪些?有什麼我應該特別注意的?我需要編寫真正不同的東西嗎?

背景說明: 我認爲組件可以從界面中受益,或者至少我會從中學到更多。例如,其中一個組件使用串行端口與許多不同的硬件進行通信。但用戶應該只使用我們的組件來創建應用程序。所以我們有這個組件和一個類,它們來自基類的後代。在運行時,我們在組件內創建特定的類。

不確定最後的解釋是否需要,但如果您需要的話,我可以寫更多。

+2

這是關於FreePascal中的接口的['basic reading'](http://www.freepascal.org/docs-html/ref/refchref.html#x84-940007)。作爲一個非常快速的結論,我會說,如果你的目標是Windows平臺,並且你將使用Windows COM架構(從IUnknown降序的接口),那麼Delphi的代碼沒有什麼區別,但是你的問題的答案應該更多複雜。 – TLama 2012-03-06 22:28:15

+0

「執行細微差別」是什麼意思?它聽起來不像是對你真正重要。不管你是否可以編寫代碼,這兩個編譯器都意味着相同的事情,而不管每個編譯器如何實現接口。 – 2012-03-06 22:46:22

+0

@DavidHeffernan我的意思是「實施中的小差異」。也許我不能編寫對兩者都是相同的代碼,但也許我不需要爲每個編譯器編寫所有的代碼。我剛剛問過我期望擁有的原因,但我不知道在這種情況下兩個編譯器是否有區別。現在更清楚了嗎? – EMBarbosa 2012-03-06 23:08:43

回答

11

在Free Pascal中,接口類型取決於模式。基本上有COM or CORBA模式。 COM是默認的,並且與Delphi大致兼容。沒有參考計算,CORBA是一個更簡單的情況。 (因此也不會生成調用函數的調用)。所以基本上FPC Corba接口就像是IUnknown接口的假設祖先。

除此之外,接口發佈時有時會有一些差異。德爾福傾向於節省在過程或塊(在較大的過程中)結束時減少refcount,而FPC有時會知道更快地釋放它們,通常在上次使用聲明後立即釋放。這兩個都是合法的實現選擇,基於哪個範圍用於臨時變量。 (只在函數級別上,或者在更深的嵌套塊中)

但是,這有時會揭示代碼中的隱藏(壞)假設,特別是在Delphi中可能「存活」的一個過程中使用接口引用和對象引用時,不在FPC中。這是一個典型的案例,表明長期工作代碼不一定是正確的。在更改實施時,人們可能只注意到隱藏的假設

(稍後添加:)請注意,您可以在* nix上使用COM樣式。它主要是將引用插入到引用計數例程中,以將兩種接口類型分開設置。不是那些呼叫路由到哪個系統(COM,Corba或簡單地在RTL引用計數中)。

請注意,我認爲兩種接口類型的COM和Corba名稱都被嚴重選中。 Corba接口實際上被反編譯,但傳統上這個refcount是手動處理的,因爲Java不支持自動處理外部接口。

+1

+1。這種信息真的很感謝。 – EMBarbosa 2012-03-09 14:29:25

相關問題