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>
ISpecificWidget
:IBaseWidget
はジェネリック作った後、私はそうのようなベース・ファサードを変更: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に変換可能ですが、そうではありません。私はウィジェットの特定の実装の拠点を持つことでこれを解決できることを知っていますが、これを可能な限り一般的なものにしています。どんなフィードバックも高く評価されます。
私は何かを忘れていたかもしれませんが、IBaseConfigurationのコードが表示されません。 –
これらのインターフェイスの具体的な例を示す良い[mcve]がなければ、その質問に答えることはできません。この特定のシナリオでタイプの差異がないため、実行しようとしていることを正確に達成できない可能性があります。一般的に、タイプ/タイプは、型パラメータとしてベース/派生型を使用しようとします。そうしないと正当ではないはずです。ジェネリック型差異のトピックに関する多くの既存の記事を読んで、あなたがしようとしていることが正当であるべきかどうかを確認し、そうであれば質問を改善する(そうでない場合は削除する) –