2015-10-30 24 views
0

我有一個問題需要解決,它圍繞着像下面這樣的代碼的想法。找到最終在一串方法調用中工作的類的名稱

public class x { 
    private y yInstance; 
    public bool doSomething(){ 
     return y.doSomething(); 
    } 
} 

public class y { 
    private z zInstance; 
    public bool doSomething(){ 
     return z.doSomething(); 
    } 
} 

public class z { 
    public bool doSomething(){ 
     return true; 
    } 
} 

我想,有x的一個實例,比布爾找出實際上做的工作,在這種情況下,「Z」類。但是,在我的情況下,可以有任何數量的圖層,並且不止一條路徑可以導致最終的課程。請讓我知道是否需要澄清任何事情。

注:我需要這樣做,而不實際調用方法

這可能嗎?

編輯:這是非常可憐的僞代碼,以證明我的用例更好一點,因爲建議。請注意,在我的存儲庫中,我使用Nhibernate標準。

public IEnumberable<T> GetByCriteria(DetachedCriteria criterion){ 
    if(criterion.Type.getFilterBase() == a) 
     criterion.AppendFilter_a(); 
    if(criterion.Type.getFilterBase() == b) 
     criterion.AppendFilter_b(); 
    if(criterion.Type.getFilterBase() == c) 
     criterion.AppendFilter_c(); 
    return criterion.execute(); 
} 

這是主意。請注意,在我的情況下,只有4個可能的基地。

+0

你可以檢查IL字節碼,如果你真的要......但是可能有一個爲您的實際問題的一個更好的辦法。爲什麼更高層需要知道低級別的類名?這是一個實現細節,它可能不應該關注它(從不知道它可能會改變,或者可能有多個'最終類'),以及如何確定哪個類正在做'實際工作')。 –

+0

這絕對不是一種選擇。原因是,根據基礎對象,我們需要在基礎知識庫中爲該對象的所有數據庫調用附加一個特定的過濾器。 –

+0

下層無法照顧那個過濾?也許你應該用實際反映你的用例的東西更新你的示例代碼,給我們更多的上下文。 –

回答

1

這實際上稱爲decorator pattern

您可以實現怎樣的一個遞歸函數:

public class x { 
    private y yInstance; 
    public bool doSomething(){ 
     return y.doSomething(); 
    } 
    public Type getWorkerClassType(){ 
     return yInstance.getWorkerClassType(); 
    } 
} 

public class y { 
    private z zInstance; 
    public bool doSomething(){ 
     return z.doSomething(); 
    } 
    public Type getWorkerClassType(){ 
     return zInstance.GetType(); 
    } 
} 

public class z { 
    public bool doSomething(){ 
     return true; 
    } 
} 
+0

這會工作,不幸的是我需要更新150+課程,我想避免這種情況... –

+0

您可以使用反射來查看您當前班級中的實例是否具有實例本身並一直回到您的原來的一個(在這種情況下'class z')。但取決於你有多少包裝類,這可能需要一些時間。 – 321polorex123

+0

我對我的同事說話,看起來您的答案可能是我最終的解決方案。我不想接受你的答案,但我會如果這是我一起去的。 –

相關問題