2010-06-17 30 views
4

我正在寫一個有兩個對象作爲私人成員的類,其中一個由類概念引用,另一個在概念上由類所擁有。但是,代碼本身並不能證明情況是這樣的。區分代碼中的擁有和引用對象?

public class WorklistSearchResults 
{ 
     //This is "owned" and will be disposed 
     private RecordSet _RecordSet = null; 
     private RecordSet RecordSet 
     { 
      //... 
     } 

     //This is "referenced" and won't be dispoesd 
     private WorkList _WorkList = null; 
     private WorkList WorkList 
     { 
      //... 
     } 
     //... 
} 

是否有標準的方法來區分擁有和引用的對象?評論是去這裏的唯一途徑嗎?

回答

3

在諸如C++的語言中,您可以將擁有的對象嵌入到類中,並通過指針指向被引用的對象。

但是,在諸如Java或C#等語言中,該解決方案通常不可用。據我所知,大多數現代OO編程語言不區分擁有和引用的對象;這是一個差異,在概念建模層面有很多意義,但由於某些原因,編程語言選擇忽略它。

就我個人而言,我依靠評論和模式來實現差異。

+0

你有一個模式的建議? – 2010-06-22 20:18:02

+2

是的。我剛纔用於C#系統的模式是,所有「擁有」對象都實現了IDisposable,而Dispose()則是根據適當的所有者類調用的。例如,這種「鏈式處置」類似於C++中嵌入對象的級聯破壞。 – CesarGon 2010-06-22 21:27:14

+0

這很有趣,B/C我試圖找到一種方式來說明這些對象應該被處置,而其他人不應該這樣做。 – 2010-06-28 12:55:19

1

「dispose」是什麼意思?在一些語言中,你會寫

myTidyUp() { 

     delete _RecordSet; 
     _RecordSet = null; 

     // not owened so don't delete 
     _WorkList = null; 

} 

但在垃圾回收的語言,我們只是代碼:

myTidyUp() {  
     _RecordSet = null; 
     _WorkList = null; 
} 

沒有什麼區別,擁有或不區分是在_Recordset的生命週期/工廠/註冊表的代碼。

如果存在某種開放/關閉生命週期需求(就像我們在JDBC連接上所做的那樣),那麼該協議就是由依賴對象定義的。

我的初步結論:在垃圾收集的環境中,「擁有」物體的文獻生命週期給了我們我們的區別。在非GC環境中,我們在需要的地方使用智能指針來管理整理。智能指針的使用使得所有權清晰。

+0

這更像JDBC連接上的生命週期。在java中,調用將是'close()',在C#中調用'.Dispose()'。 – 2010-06-28 12:56:33

0

對於這樣的問題的另一種可能的技術是在變量名稱上使用某種前綴來區分擁有和非擁有,作爲一種自我評論機制–,特別是將這樣的前綴放在非擁有的對象。我見過這種技術被稱爲「應用匈牙利語」符號。這不是一種普遍流行的技術,但是如果你發現自己在很多時候都在玩弄它,它可能會有所幫助。

+0

一個有趣的概念。我得考慮一下。 – 2010-06-28 12:57:18