私はかなり多くの可能な回答を読み、私のニーズに合ったものは見つけられませんでした。ジェネリックインターフェイスの非汎用実装
ジェネリックインターフェイスを宣言しようとしていて、ジェネリックでない実装クラスを別にして、このクラスを同じコンテキストで使用しようとしています。
これは私がこれまで持っているものです。
インタフェース
public interface WeirdType { }
public class WeirdType1 : WeirdType { }
public class WeirdType2 : WeirdType { }
public interface IGenericInterface<T>
{
T GiveT();
void TakeItBack(T data);
}
public class NonGenericImplementation1 : IGenericInterface<WeirdType1>
{
public WeirdType1 GiveT() { return new WeirdType1(); }
public void TakeItBack(WeirdType1 data) { Console.WriteLine("Got it back 1"); }
}
public class NonGenericImplementation2 : IGenericInterface<WeirdType2>
{
public WeirdType2 GiveT() { return new WeirdType2(); }
public void TakeItBack(WeirdType2 data) { Console.WriteLine("Got it back 2"); }
}
使用
List<IGenericInterface<WeirdType>> implementations = new List<IGenericInterface<WeirdType>>
{
new NonGenericImplementation1(),
new NonGenericImplementation2()
};
foreach (var impl in implementations)
{
WeirdType x = impl.GiveT();
impl.TakeItBack(x);
}
実装は、これは私がスローされます
また、黒いキャスティングマジックがコンパイルによって私を取得しても、同じ理由で実行時にクラッシュします。
私は私の実際の問題の異なった方法の多くを解決することができるので、完全に別の解決策が実際にはありませんどのようなC#のタイピングのためにこれを不可能にする、および/またはそれがスムーズに
を成し遂げるために少し複雑なパターンを示唆して理解させます私は
を探していますと、明らかに実際の答えはすでにいつものように、それはまだ私が助けるために全力を尽くします、コンテキストなしで適切であることを難しい
:純粋にゲッターを使用しているとき、あなたはインターフェイスの共変を作ることができますそれを 'public interface IGenericInterface'と宣言します。リストの実装はそのまま受け入れられますが、受け入れられた答えで説明されている理由でTakeItBack関数が許可されません(例えば 'void TakeItBack(WeirdType data);と定義されていない限り) –
私の実装のそれぞれは、それ自体で!つまり、私の使用中にWeirdtypeの代わりに(impl.T)のようなものを使うことができたら、これは型付けの観点から正しく動作するはずです。 –