2015-06-04 84 views
3

我製作了一臺將餅乾從一種類型轉換爲另一種類型的機器。你可以將通用對象分組到列表中嗎?

每個BiscuitTransformer具有類似DigestiveBiscuitTransformer的方法:

IBiscuit Transform(DigestiveBiscuit digestiveBiscuit)方法。

考慮到每種變壓器的類型不同,是否可以使用通用接口將它們分組,例如,在ChocolateBiscuitTransformer

IBiscuit Transform(ChocolateBiscuit chocolateBiscuit)

的GingerNutBiscuitTransformer:

IBiscuit Transform(GingerNutBiscuit gingerNutBiscuit)

理想情況下,我想實現,是一個BiscuitTransformationManager,將採取在任何類型的餅乾,給你一個IBiscuit回。

它將所有變壓器的加載到List<IBiscuitTransformer>然後IBiscuitTransformer也將暴露Type InputBiscuitType {get;}所以你可以把它比作你的來電餅乾類:

BiscuitTransformationManager:

IBiscuit Transform<T>(T biscuit) 
{ 
    var transformer = LoadTransformers().Single(c => c.InputBiscuitType == typeof(T)); 

    return transformer.Transform(biscuit); 
} 

我不認爲因爲變壓器將會期待一個具體的類型,而不是T.

問題是我無法弄清楚如何將它們分組,如果我使接口方法Transform<T>我不知道如何實現它,因爲在DigestiveBiscuitTransformer中T始終是DigestiveBiscuit,但代碼會接受任何內容,這是沒有意義的。

任何想法?

+8

「我製作了一臺將餅乾從一種類型轉換爲另一種類型的機器。」你應該申請專利。 – BoltClock

+0

我會,但它不工作...! – NibblyPig

+0

做所有的餅乾實施IBiscuit開始? – sstan

回答

1

我不認爲你在這裏需要泛型。

如何簡單:

IBiscuit Transform(IBiscuit biscuit) 
{ 
    var transformer = LoadTransformers().Single(c => c.InputBiscuitType == biscuit.GetType()); 

    return transformer.Transform(biscuit); 
} 

但是,當然,這意味着每個變壓器應該有匹配的方法簽名而不是類型具體,我認爲這實際上是走正確的路。

所以不是

IBiscuit Transform(DigestiveBiscuit digestiveBiscuit) 

更改該變壓器的簽名(和其他人一樣)來:

IBiscuit Transform(IBiscuit digestiveBiscuit) 

我覺得這樣的設計是不是試圖使其與仿製藥的工作更清潔,更簡單。

+0

與上面相同的評論,每個變壓器採取具體類型的原因是它必須訪問該類型的特定屬性,所以你在DigestiveBiscuitTransformer的第一行中,您必須將您的IBiscuit投入DigestiveBiscuit,以便能夠訪問其屬性進行轉換。 – NibblyPig

0

我想你可以將所有類型的餅乾組合成BiscuitTransformManager

public interface ITransformedBiscuit {} 

public class DigestiveBiscuit : ITransformedBiscuit {} 

public class ChocolateBiscuit : ITransformedBiscuit {} 

public class BiscuitTransformManager 
{ 
    IBiscuit Transform(ITransformedBiscuit biscuit) 
    { 
     // Use a reflection in here 
     var instances = from t in Assembly.GetExecutingAssembly().GetTypes() 
      where typeof(ITransformedBiscuit).IsAssignableFrom(t) 
        && t.GetConstructor(Type.EmptyTypes) != null 
      select Activator.CreateInstance(t) as ITransformedBiscuit; 

     foreach (var instance in instances) 
     { 
      instance.Transform(biscuit) 
     } 
    } 
} 
+0

這很好,但變壓器必須知道餅乾的具體類型,所以在第一行說,'DigestiveBiscuitTransformer'你必須做'DigestiveBiscuit餅乾=(DigestiveBiscuit)ITransformedBiscuit'所以你指定' IBiscuit「,但該方法只適用於」DigestiveBiscuit「,我希望有辦法讓它更安全/更好。 – NibblyPig

相關問題