2010-07-07 47 views
1

我有兩個在運行時實例化並加載的類。我想檢查一個資源,而不必引用這些實例,因爲如果有很多檢查和類,它可能會變得混亂。跨實體通信而無需引用實例C#

例如,如果我有以下兩個類,並且我想調用另一個類。


Class Item 
{ 
    private int id; 
    private int loc; 

    void Item() 
    { 
     // the Class actually has some properties with get set, but thats not the point here. 
     id = 1; 
     loc = 2; 
    } 

    public bool check() 
    { 
     // Check if the several fields are ok for DB submission 

     // how Can I refer to the other class from here? Do I have to pass the instance as a parameter? 
     return Locals.Exists(loc); // does not work because its not static! 
    } 

} 

Class Locals 
{ 
    Hashtable l = new Hastable(); 

    void Locals() 
    { 
     // This will actually be loaded from a DB at runtime. 
     l.add(1, "Local 1"); 
     l.add(2, "Local 2"); 
    } 

    public bool Exists(int i) 
    { 
     return l.ContainsKey(i); 
    } 

} 

//Form Code: 
main() 
{ 
    Item newItem = new Item(); 
    Locals allLocals = new Locals(); 

    newItem.check(); 
} 

有沒有辦法做到這一點,而不必調用

 
    newItem.check(allLocals); 

從我所看到的,即使有代表,主叫CLASSE需要其他類的實例。

總之,是否有另一種方式來促進跨實例通信?

我很困惑嗎?

+0

你可以簡單地使用某種形式的聚合器或消息發佈系統,但是這種有點像代碼味道......你爲什麼需要這樣做? – Firoso 2010-07-07 16:41:03

+0

我會檢查數據庫,而不是實例化的類。 – Fosco 2010-07-07 16:42:35

+0

如果您不指定要檢查哪些當地人,您怎麼知道要檢查哪一個(甚至哪個)? – 2010-07-07 16:43:10

回答

0

不知道我明白你的意思,但我通常使用的所有對象

Class Locals 
{ 
public static List<Locals> MyLocals = new List<Locals>(); // first thing i add 
Hashtable l = new Hastable(); 

void Locals() 
{ 
    // This will actually be loaded from a DB at runtime. 
    l.add(1, "Local 1"); 
    l.add(2, "Local 2"); 

    MyLocals.Add(this); // second thing i add 
} 

,然後你可以從靜態上下文對象的添加對於類似案件的靜態列表。

一定要編輯dispose函數,否則GC將無法工作。

+0

有趣的aproach。它並不完全解決這個問題,但似乎是一種可能的方法。 您可以詳細說明Dispose功能嗎? – upsfeup 2010-07-07 23:37:45

+0

如果您不處理創建的列表中的對象 - 它們將永遠不會被垃圾收集器收集(因爲它們有引用它們的引用)。如果你正在使用耗費內存的對象並且不處理它們 - 你將會遇到內存不足的異常...... 通常我會繼承「IDisposable」接口並實現一個簡單的「MyLocals.Remove(this) ;」作爲功​​能體。當我完成對象的調用時,GC可以自由地收集它。 它確實需要我自己對這些對象進行內存管理,所以有時候我需要一個更復雜的邏輯...... – Kaneti 2010-07-09 07:00:03

0

這並不完全清楚你想要在這裏完成什麼,但解決傳遞大量實例的問題的一個選擇是使用IoC框架(Ninject is one example,但有幾種可供選擇)。實例會在構建對象時動態注入,這可以幫助減少不便的膠水代碼。還有其他模式可以讓這些類找到彼此(一個Singleton實例或某種形式的Repository,它允許使用一些標識數據來查找實例)。也可以使用消息傳遞設計,它強烈地分離類,在一些額外開銷的成本。

這真的取決於你想要做什麼。每個設計都有其優點和缺點。

0

如何從這裏引用其他類 ?我是否必須通過 實例作爲參數?

是的,與實例進行通信的唯一方法是獲取對它(或中介)的引用。由於Locals不是靜態類,因此將實例傳遞給構造函數或方法參數Item

相關問題