私は抽象クラスを持っています。ジェネリック型引数をとり、他の2つのクラスHumanとSpiderで拡張されたクリーチャーです。各サブクラスはその親のジェネリック型を定義します。ジェネリッククラスを拡張するクラスのジェネリック型パラメータを渡さないようにする
親クラスの参照としてサブクラスをメソッドに渡す方法が残っています。
public interface IDamagable
{
void OnSimpleHit();
}
public interface IStabAble : IDamagable
{
void OnKnifeStab();
}
public interface ISlapAble : IDamagable
{
void OnSlap();
}
public abstract class Creature<T> where T : IDamagable
{
public abstract void Init(T damageListener);
}
public abstract class Human : Creature<ISlapAble>
{
}
public abstract class Spider : Creature<IStabAble>
{
}
public class MainClass
{
public void Test()
{
List<Spider> spiderList = new List<Spider>();
List<Human> humanList = new List<Human>();
PrintList<IDamagable>(spiderList); // Argument `#1' cannot convert
//`System.Collections.Generic.List<newAd.B_A_A>' expression
//to type `System.Collections.Generic.List<newAd.A_A<newAd.I_B>>'
}
protected void PrintList<T>(List<Creature<T>> list)
{
}
}
このdoesntのスローエラーがprintlistは
protected void PrintList<T,U>(List<T> list) where T : Creature<U> where U : IDamagable
{
}
2つのジェネリック引数を取ったが、Tがすでにタイプパラメータ、例えばスパイダーとしてUで構築したとして、私は、再びUに合格しない場合すでに定義されているクリーチャーがIStabAbleの型パラメータを取るように定義されています。
基本的に、私は、SpiderとHumanの両方を最小限の数の汎用パラメータで処理できるようにメソッドを記述する方法についています。
ありがとう
クラス階層の関係を理解しやすいように名前を変更することを検討してください。あなたのコードを理解するだけで、頭痛を覚えるのであれば、多くの助けを得ることはありません。 I_A' – InBetween
Tはどこ '無効がprintlist(IEnumerableを>リスト)に' PrintList'メソッドのシグネチャを変更してみてください –
はクラスとインタフェースを改名など @YacoubMassad私はIEnumerableをにリストを変更すると何がどのように変化するかを理解していない: – Farhan