2017-04-06 40 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. –

相關問題