2017-04-06 60 views
-1

我想在C#中有一个程序,对象A不能创建没有对象B,也是当对象B被销毁时,对象A会自动拆除。所以对象A的存在将完全依赖于对象B的存在。对象不能存在没有和另一个对象外

我知道有可能在B的承包商中强制A,但是我想使它不可能在B的任何部分创建A外部B应用。也许是工厂模式?我不确定如何限制其他开发人员创建一个类,或者以某些标准创建它。

+1

您的问题将从一个小的可运行示例中受益,该示例说明了您尝试的内容。现在它在审查堆栈上弹出,不是一个明确的问题。 –

回答

1

我想在C#程序对该对象的不能没有对象B

这部分很简单创建 - 只是让A有一个构造函数B

并且当对象B被销毁时,对象A将被自动拆除。

那部分并不那么平凡;尤其是你无法控制垃圾回收,你也不会控制什么引用了A实例,所以你可以做的最多的就是生成B配置A

确实,如果A取决于B,那么A可能与B有关。这意味着,如果A是可到达的(未垃圾),然后既不B(因为它可以通过A到达),因此B不会首先收集。并且如果B被破坏,那么我们已经知道A是通过相同的推理敬酒的。从某个角度来看,这实际上实现了你想要的一切。

唯一明智的时间实际上的东西在这里(而不是仅仅依靠可达图)是处置B。所以在这一点上,你已经得到的东西,如:

class A : IDisposable { 
    B _b; 
    A(B b) { b.Register(this); _b = b; } 
    void IDisposable.Dispose() { _b = null; } 
    void CheckDisposed() { if(_b == null) throw new ObjectDisposedException(nameof(A)); } 
    public void ActualMethod() { 
     CheckDisposed(); 
     // do stuff 
    } 
} 
class B : IDisposable { 
    A _a; 
    internal void Register(A a) { 
     if(a == null) throw new ArgumentNullException(nameof(a)); 
     if(_a != null) throw new InvalidOperationException("already has an A"); 
     _a = a; 
    } 
    void IDisposable.Dispose() { 
     var tmp = _a; 
     _a = null; 
     tmp?.Dispose(); 
    } 
} 

然而,在这一点上的类型是如此相互依赖,我怀疑有两种类型的目的。有许多方法可以放松这种依赖关系,并允许0- *映射,但这是一个奇怪的要求,我没有看到它的目的。

+0

问题是,我有一个系统,其中的类将被其他程序员使用,我想限制他们在创建没有另一个对象的对象时的选项。即使我在B承包商中做A,也不意味着A不能单独在程序的其他部分创建。我想让无B创建A成为可能。也许工厂模式? –

+0

@RoozbehHalvaei你会注意到我把A *传递给了构造函数 - 我没有在内部创建它,所以要创建一个B,在上面的代码中你已经需要一个A. –

相关问题