2013-09-22 46 views
0
public interface IHasFeature<TFeature> { 
    TFeature Feature { get; set; } 
} 
public class FeatureOne { 
    /*...*/ 
} 
public class ProductOne : IHasFeature<FeatureOne> { 
    public FeatureOne Feature { get; set; } 
} 
public abstract class BaseContainer<TProduct, TFeature> 
where TProduct : IHasFeature<TFeature> { 
    public TProduct Product { get; set; } 
    public void DoProcess() { 
     var result = Product.Feature.Execute(); //Execute is an extension method 
    } 
} 
public class MyContainer : BaseContainer<ProductOne, FeatureOne> { 
    /*...*/ 
} 

作品,當我做如何簡化此嵌套泛型類型類

MyContainer : BaseContainer<ProductOne, FeatureOne> 

但我想

MyContainer : BaseContainer<ProductOne> 

ProductOne : IHasFeature<...>應該已經包含嵌套泛型功能TFeature,我不想在MyContainer建設中再次重複它們。

任何想法,我可以改善這一點?謝謝。

EDIT2 -----------------------

刪除新的關鍵字,這是錯誤的,因爲雷納德說。

+0

首先,爲什麼'IHasFeature'通用的,當你根本不使用泛型?難道它不是標準的非通用接口嗎?它會解決你的問題。 – MarcinJuraszek

+1

像'FeatureOne'這樣的特性是否應該從通用接口IFeature繼承? – Nenad

+0

您的容器需要某些功能,您想如何告訴它哪些功能需要?在你的「但我想要」部分中,「MyContainer」應該怎麼知道要驗證什麼?你說'ProductOne'知道'FeatureOne',但是你想驗證一個產品是否有一個已經有的功能。這對我來說沒有意義,或者我不明白你想達到什麼目的。 – BartoszKP

回答

0

編譯將您的調用轉換爲擴展方法Execute(),作爲對其定義的類的靜態方法的調用。因此,當您在DoProcess()中調用Product.Feature.Execute()時,編譯器需要知道Product.Feature的類型以便調用相應的擴展方法。

我所說的其實是寫IHasFeature這樣

public interface IHasFeature 
{ 
    void DoSomethingWithFeature(); 
} 

如果你想保持IHasFeature通用的,你能做的最好的就是定義BaseContainer不指定TFeatureMyContainer實施DoProcess()

public abstract class BaseContainer<TProduct> 
{ 
    public TProduct Product { get; set; } 
    public abstract void DoProcess(); 
} 

public class MyContainer : BaseContainer<ProductOne> 
{ 
    public override void DoProcess() 
    { 
     Product.Feature.Execute(); 
    } 
}