次の操作を行うことができます。
class GenClass<T, TT, TU> where T: IFace<TT, TU>
GenClass
を初期化するときに、3つのパラメータをすべて定義できます。
class MyFace<T, U> : IFace<T, U>
var instance = new GenClass<MyFace<string, int>>();
それとも
あなたがたとえば、あなたもこれを行うことができますについての2つのプロパティを知っている以外の一般的な基本型を提供する場合
class MyFace : IFace<string, int>
var instance = new GenClass<MyFace>();
。
interface IFace<T, U>
{
T ValueOne { get; set; }
U ValueTwo { get; set; }
}
abstract class FaceBase : IFace<object, object>
{
public object ValueOne { get; set; }
public object ValueTwo { get; set; }
protected FaceBase(object valueOne, object valueTwo)
{
ValueOne = valueOne;
ValueTwo = valueTwo;
}
}
class GenClass<T> where T : FaceBase
{
private T Value { get; set; }
public GenClass()
{
// do something with Value.ValueOne or Value.ValueTwo
}
}
FaceBase
の実装は、次のようになります。
class MyFace : FaceBase, IFace<string, int>
{
public new string ValueOne
{
get => base.ValueOne as string;
set => base.ValueOne = value;
}
public new int ValueTwo
{
get => (int) base.ValueTwo;
set => base.ValueTwo = value;
}
public MyFace(string valueOne, int valueTwo)
: base(valueOne, valueTwo)
{ }
}
'IFace'インターフェイスは、 'T'と' U'で指定されたクラスを持たないと意味をなさない。どのような行動を望んでいますか?つまり、書いておきたいコードの例を挙げることができますか?ジェネリックスが間違っていたり、間違った方法で問題を解決しようとしているように間違っているようです... –
Chris
@Chris現実には、2つの異なる実装を登録するサービスロケータのヘルパーメソッドを作成しようとしています。インターフェース(そしてそれらの実装のうちの1つはもう1つの制約よりも少し制約があります)。問題は、基本インターフェースにはすでに2つの汎用パラメータがあるため、ヘルパークラスにはコンパイルするための5つの汎用パラメータが必要であるということです(これはうまくいきますが)。そういうわけで、物事を単純化する方法がないのだろうかと思っていました。 – Shaamaan
ああ。あなたがどこから来ているのか、おおよそわかります。単純化できるかどうかを尋ねたコードで別の質問をするべきかどうか疑問に思っています。 codreview.stackexchange.comに置くのが最善であるかどうかわからない(免責事項:私はそこに遊んでいるわけではないので、トピックにあるものの漠然とした考えがあるので、チェックしてください)コードが動作してから、より読みやすくすることができれば。 – Chris