我想在C#中有一个程序,对象A不能创建没有对象B,也是当对象B被销毁时,对象A会自动拆除。所以对象A的存在将完全依赖于对象B的存在。对象不能存在没有和另一个对象外
我知道有可能在B的承包商中强制A,但是我想使它不可能在B的任何部分创建A外部B应用。也许是工厂模式?我不确定如何限制其他开发人员创建一个类,或者以某些标准创建它。
我想在C#中有一个程序,对象A不能创建没有对象B,也是当对象B被销毁时,对象A会自动拆除。所以对象A的存在将完全依赖于对象B的存在。对象不能存在没有和另一个对象外
我知道有可能在B的承包商中强制A,但是我想使它不可能在B的任何部分创建A外部B应用。也许是工厂模式?我不确定如何限制其他开发人员创建一个类,或者以某些标准创建它。
我想在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- *映射,但这是一个奇怪的要求,我没有看到它的目的。
问题是,我有一个系统,其中的类将被其他程序员使用,我想限制他们在创建没有另一个对象的对象时的选项。即使我在B承包商中做A,也不意味着A不能单独在程序的其他部分创建。我想让无B创建A成为可能。也许工厂模式? –
@RoozbehHalvaei你会注意到我把A *传递给了构造函数 - 我没有在内部创建它,所以要创建一个B,在上面的代码中你已经需要一个A. –
您的问题将从一个小的可运行示例中受益,该示例说明了您尝试的内容。现在它在审查堆栈上弹出,不是一个明确的问题。 –