2016-06-19 10 views
0

私はこのジェネリックインターフェイスと継承

public interface IBaseWidget<T> where T: IBaseConfiguration 
{ 
    void Configure(T configuration); 
} 

のように見えるベースのインタフェースを持って、私は次のようになり、子のインターフェイスがあります。

public interface ISpecificWidget : IBaseWidget<IChildSpecificConfiguration> 
{ 
} 

IChildSpecificConfigurationすることは、私は、その後のように見えるのクラスを持っているIBaseConfigurationを実装この

public class SomeClass : ISpecificWidget 
{ 
    public void Configure(IChildSpecificConfiguration configuration) 
    { 
     //do stuff 
    } 
} 

これはすべて問題なく動作しますこれに戻ります。

ここでは、いくつかの異なるSomeClassがあることを意味するIBaseWidget<T>のいくつかの異なる拡張があることが分かり始めます。さらに、SomeClassはファサードを介してのみアクセスされるので、ルールの束に基づいて、必要なSomeClassのインスタンスを実際に作成する基本ファサードがあります。上記のようIBaseWidgetジェネリックを行う前に、私のベースのファサードには、以下のように見えた:IBaseFooの各実施のための

public abstract class BaseFacade<T> where T IBaseWidget 
{ 
    T Widget {get;set;} 
    private void Init() 
    { 
     Widget = (T)Activator.CreateInstance("type"); 
    } 
} 

ファサードはそうのようになります。

再び
public sealed class SomeFacade : BaseFacade<ISpecificWidget> 
{ 
    private void DoSomething() 
    { 
     Widget.DoSomething(); 
    } 
} 

、これは正常に動作します。 IBaseWidget<IBaseConfiguration>

に変換可能でなければならない

ISpecificWidgetIBaseWidgetはジェネリック作った後、私はそうのようなベース・ファサードを変更:

public abstract class BaseFacade<T> where T : IBaseWidget<IBaseConfiguration> 
{ 
    T Widget {get;set;} 
    IBaseConfiguration configuration; //IChildSpecificConfiguration passed in via constructor and assigned to variable 
    private void Init() 
    { 
     Widget = (T)Activator.CreateInstance("type"); 
     Widget.Configure(configuration) 
    } 
} 

これは、メッセージをSomeFacadeの上記implmentationを破る私の問題はこれです

私が期待したのは、ISpecificWidgetのように定義されています。

public interface ISpecificWidget : IBaseWidget<IChildSpecificConfiguration> 
{ 
} 

IBaseWidgetに変換可能ですが、そうではありません。私はウィジェットの特定の実装の拠点を持つことでこれを解決できることを知っていますが、これを可能な限り一般的なものにしています。どんなフィードバックも高く評価されます。

+0

私は何かを忘れていたかもしれませんが、IBaseConfigurationのコードが表示されません。 –

+1

これらのインターフェイスの具体的な例を示す良い[mcve]がなければ、その質問に答えることはできません。この特定のシナリオでタイプの差異がないため、実行しようとしていることを正確に達成できない可能性があります。一般的に、タイプ/タイプは、型パラメータとしてベース/派生型を使用しようとします。そうしないと正当ではないはずです。ジェネリック型差異のトピックに関する多くの既存の記事を読んで、あなたがしようとしていることが正当であるべきかどうかを確認し、そうであれば質問を改善する(そうでない場合は削除する) –

答えて

0

これはあなたの問題に答えるかもしれません。

このインタフェースを追加します。次に

public interface IBaseWidget 
{ 
    void Configure(IBaseConfiguration configuration); 
} 

それを継承する:

public interface IBaseWidget<T> : IBaseWidget 
    where T : IBaseConfiguration 
{ 
    void Configure(T configuration); 
} 

そして最後に:

public abstract class BaseFacade<T> where T : IBaseWidget 
{ 
    T Widget { get; set; } 
    IBaseConfiguration configuration; //IChildSpecificConfiguration passed in via constructor and assigned to variable 
    private void Init() 
    { 
     Widget = (T)Activator.CreateInstance(typeof()); 
     Widget.Configure(configuration); 
    } 
} 

と:

public class SomeClass : ISpecificWidget 
{ 
    void IBaseWidget.Configure(IBaseConfiguration configuration) 
    { 
     throw new NotImplementedException(); 
    } 

    public void Configure(IChildSpecificConfiguration configuration) 
    { 
     //do stuff 
    } 
}