2012-04-16 54 views
1

我有兩個類共享相同的方法,我想根據需要在代碼中切換它們。如果你看下面的例子,你會發現代碼的相同部分是重複的。 CacheFile和CacheMemory類是相同的,我相信這個代碼可以縮小,並且可以切換CacheFile和CacheMemory類。根據值切換類

if (_cacheLocation == CacheLocation.File) 
    { 
     if (!CacheFile.Get(key, out value)) 
     { 
      // Do lookup based on caller's logic. 
      context.Proceed(); 
      value = context.ReturnValue; 
      CacheFile.Add(value, key, _cacheType, _expiry); 
     } 
    } 

    if (_cacheLocation == CacheLocation.Memory) 
    { 
     if (!CacheMemory.Get(key, out value)) 
     { 
      // Do lookup based on caller's logic. 
      context.Proceed(); 
      value = context.ReturnValue; 
      CacheMemory.Add(value, key, _cacheType, _expiry); 
     } 
    } 
+4

看看接口。 – CodeCaster 2012-04-16 15:32:42

+0

您必須對兩者都使用通用接口,並在對象(而不是類)上調用「get」/「add」方法。 – rottz 2012-04-16 15:33:46

回答

4

如果您使CacheLocation和Cache Memory實現一個通用接口,則可以使用接口而不是單個類。

http://msdn.microsoft.com/en-us/library/ms173156.aspx

+0

我知道關於接口,但你可以展示如何在實現接口分類之間切換的例子嗎? – Tomas 2012-04-16 15:37:08

+0

不用爲_cacheLocation字段賦值,而是使用一個字段來存儲使用該接口的緩存作爲其類型。然後,您可以刪除您的if語句,並調用接口上的方法。要切換類,請通過實例化所選類,將包含接口的屬性的值分配到您當前分配_cacheLocation字段的相同位置。 – 2012-04-16 15:47:59

2

使用封裝的複製行爲(定義揭露這種行爲的接口)的類。在兩個爲CacheLocation.File和CacheLocation.Memory執行預期操作的類上實現此接口。

然後,您可以使用返回ICache的工廠,給定CacheLocation並且消費者可以使用它,而無需知道它在下面使用的實際存儲的類型。

+0

你能展示如何在類之間切換嗎?我知道如何實現接口,這裏沒有問題。 – Tomas 2012-04-16 15:38:18

0

有幾種方法可以處理這個問題。如果CacheMemory和CacheFile彼此繼承,或者共同的基類,則可以聲明父類的變量並使用它。或者,如果您不想從另一個(或來自公共基礎)推導出一個,則可以讓它們實現一個通用接口並使用一個聲明爲接口實例的變量。

0

您可以像下面那樣定義一個接口,從中繼承CacheFile和CacheMemory。

public interface ICache 
{ 
    Get(); 
    Add(); 
} 

它可以減少代碼膨脹。

+0

如何在我的案例類之間切換? – Tomas 2012-04-16 15:39:01