Oop 在代码中区分拥有对象和引用对象?

Oop 在代码中区分拥有对象和引用对象?,oop,Oop,我正在编写一个类,它有两个对象作为私有成员,其中一个在概念上由类引用,另一个在概念上由类拥有。然而,代码本身并没有给出这种情况的线索 public class WorklistSearchResults { //This is "owned" and will be disposed private RecordSet _RecordSet = null; private RecordSet RecordSet {

我正在编写一个类,它有两个对象作为私有成员,其中一个在概念上由类引用,另一个在概念上由类拥有。然而,代码本身并没有给出这种情况的线索

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
        {
            //...
        }
        //...   
}

是否有标准的方法来区分拥有的对象和引用的对象?注释是这里唯一的方法吗?

< P>在C++等语言中,可以将已拥有的对象嵌入到类中,并通过指针指向被引用的对象。 然而,在Java或C#等语言中,该解决方案通常不可用。据我所知,大多数现代OO编程语言不区分拥有对象和引用对象;这是一个在概念建模级别上很有意义的区别,但出于某种原因,编程语言选择忽略它

就个人而言,我依靠注释和模式来实现差异。

什么是“处置”呢?用一些语言你可以写

 myTidyUp() {

      delete _RecordSet;
      _RecordSet = null;

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

 }
但在垃圾收集语言中,我们只需编写代码:

 myTidyUp() {      
      _RecordSet = null;
      _WorkList = null;
 }
没有区别,拥有与否的区别在于_记录集的生命周期/工厂/注册表代码

如果存在某种打开/关闭的生命周期需求(就像我们在JDBC连接上所做的那样),那么该协议由依赖对象定义


我的初步结论是:在垃圾收集的环境中,“拥有”对象的记录生命周期给了我们区别。在非GC环境中,我们在需要时使用智能指针管理整理。智能指针的使用使所有权清晰明了。

解决此类问题的另一种可能的技术是在变量名上使用某种前缀来区分自有和非自有,作为一种自我注释机制——特别是在非自有对象上加上这样的前缀。我见过这种被称为“应用匈牙利”符号的技术。这并不是一种普遍流行的技巧,但若你们发现自己在这两方面都花了很多时间,它可能会有所帮助

你有没有关于图案的建议?是的。我不久前在C#系统中使用的一种模式是,所有“拥有的”对象都实现了IDisposable,并根据需要从owner类调用Dispose()。这个“链式处理”类似于C++中嵌入对象的级联破坏。这很有趣,B/C我试图找到的方法来说明这些对象应该被处理,而这些其他对象不应该这样。这更像JDBC连接上的生命周期。在java中调用是
close()
,在C中调用是
.Dispose()
。这是一个有趣的概念。我得考虑一下。