2012-05-25 86 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

相关问题