1

私は、そのインターフェースの多くの実装を備えた「フィルター」のインターフェースを持つユーティリティに取り組んでいます。インターフェイスの一部は、フィルターを操作するために UI で使用される Control 型のオブジェクトを返します。

コントロールがそれらを作成したオブジェクトに書き戻すように要求するなどのことができるように、返されたコントロールにも別のインターフェイスを実装することを要求できるようにしたいと考えています。

今私のコードは次のようになります:

public interface IFilter
{
    Control Control();
}

次のようなものが欲しいです:

public interface IFilterControl
{
    ...
}

public class FilterControl : Control, IFilterControl{}

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

FilterControl は実際には IFilterControl を実装していないため、上記は機能しません。

上記が十分に明確でない場合は、架空のキーワード「実装」がどのように機能するかを以下で視覚化してみてください

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;
4

1 に答える 1

5

ジェネリックの使用を検討したい場合があります。型に制約を課すことができます。

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

where 句は一般的な制約であり、T が常に Control 型である必要があります。インターフェイスでも機能します。そうすれば、これらのメソッドまたはプロパティが常に Control の派生物であり、それらの期待が IntelliSense に表示されることがわかります。

編集ああ、必要に応じて、ジェネリックをメソッドでのみ適用できることに気付きました。

interface IFilter
{
    T Control<T>() where T : Control;
}
于 2012-05-25T22:32:00.387 に答える