我想在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. –
您的問題將從一個小的可運行示例中受益,該示例說明了您嘗試的內容。現在它在審查堆棧上彈出,不是一個明確的問題。 –