2012-05-25 88 views
1

我正在研究一個實用程序,該實用程序將具有用於「過濾器」的接口以及該接口的多個實現。接口的一部分將返回一個類型爲Control的對象,該對象將在UI中用於操作過濾器。需要具體類的子類以及接口的C#類型

我希望能夠要求返回的控件也實現另一個接口,以便我可以執行諸如請求控件回寫到創建它們的對象之類的事情。

現在我的代碼如下所示:

public interface IFilter 
{ 
    Control Control(); 
} 

我想成才,如:

public interface IFilterControl 
{ 
    ... 
} 

public class FilterControl : Control, IFilterControl{} 

public interface IFilter 
{ 
    ... 
    FilterControl Control(); 
} 

上述不起作用,因爲FilterControl並沒有真正實現IFilterControl。

如果上面是不夠清晰嘗試直觀瞭解虛關鍵字「implmenting」將努力之下

public interface IFilterControl 
{ 
    IFilter Filter{get;} 
} 

public interface IFilter 
{ 
    Control implmenting IFilterControl Control(); 
} 

public interface FilterImpl : IFilter 
{ 
    Control implmenting IFilterControl Control(){ 
     return new FilterControlImpl(this); 
    } 
} 

public partial class FilterImplControl : UserControl, IFilterControl 
{ 
    FilterImpl filter; 
    public FilterImplControl(FilterImpl filter) 
    { 
     this.filter = filter; 
    } 

    public IFilter Filter{get{return filter;}} 
} 


FilterImpl a_filter = GetAFilter(); 
Control implmenting IFilterControl ctl = a_filter; 
panel.Controls.Add(ctl); 
FilterImpl the_filter_indirectly = ctl.Filter; 

回答

5

可能想看看在使用泛型。他們會讓你對類型進行限制。

public interface IFilter<T> where T : Control 
{ 
    T Control { get; set; } 
    T ControlMethod(); 
} 

where子句是一個通用約束,並要求T始終爲Control類型。它也適用於接口。這樣,您就知道這些方法或屬性始終是Control的衍生物,並且這些期望會以智能感知形式顯示出來。

編輯 哦,剛纔我發現,如果你願意,你可以單獨使用泛型。

interface IFilter 
{ 
    T Control<T>() where T : Control; 
} 
+1

這是個好主意,@JacobProffit。實際上,您可以在類和接口上約束T(http://msdn.microsoft.com/zh-cn/library/ms379564(v=vs.80).aspx#csharp_generics_topic4)。 – SirPentor

+1

對。帶約束的泛型非常棒。 :) –

+0

我不清楚在這種情況下,帶有IFilter實例集合的類如何在不知道T的情況下調用Control()。你能擴展這個例子嗎? – tletnes

相關問題