C#类型需要特定类的子类以及接口

tle*_*nes 1 c# interface subclass

我正在开发一个实用程序,它将具有"Filters"的接口,该接口具有该接口的许多实现.接口的一部分将返回Control类型的对象,该对象将在UI中用于操作过滤器.

我希望能够要求返回的控件还实现另一个接口,以便我可以执行诸如请求控件写回创建它们的对象之类的操作.

现在我的代码看起来像:

public interface IFilter
{
    Control Control();
}
Run Code Online (Sandbox Code Playgroud)

我想要像:

public interface IFilterControl
{
    ...
}

public class FilterControl : Control, IFilterControl{}

public interface IFilter
{
    ...
    FilterControl Control();
}
Run Code Online (Sandbox Code Playgroud)

上面的方法不起作用,因为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;
Run Code Online (Sandbox Code Playgroud)

Jac*_*itt 5

可能想看看使用泛型.他们会让你对类型施加约束.

public interface IFilter<T> where T : Control
{
    T Control { get; set; }
    T ControlMethod();
}
Run Code Online (Sandbox Code Playgroud)

where子句是一个通用约束,并且要求T始终是Control类型.它也适用于接口.这样,您就知道这些方法或属性始终是Control的衍生物,这些期望将出现在intellisense中.

编辑哦,我突然想到,如果你愿意的话,你可以单独使用该方法.

interface IFilter
{
    T Control<T>() where T : Control;
}
Run Code Online (Sandbox Code Playgroud)