避免传递扩展泛型类的类的泛型类型参数

法汉

我有一个抽象类Creature,它带有一个通用类型参数,并由其他两个类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)
    {

    }
}

如果PrintList接受2个通用参数,则不会引发错误

protected void PrintList<T,U>(List<T> list) where T : Creature<U> where U : IDamagable
    {

    }

但是然后我不想再传递U,因为T已经使用U作为类型参数构造了,例如Spider已经定义了Creature以使用IStabAble的类型参数。

因此,基本上,我坚持如何编写该方法,以便它以最少的通用参数同时满足Spider和Human的要求。
谢谢

雅库布·马萨德(Yacoub Massad)

我假设PrintList只需要对列表的只读只读访问权限。

解决方案是使该PrintList方法接受IEnumerable<Creature<T>>如下所示:

void PrintList<T>(IEnumerable<Creature<T>> list) where T: IDamagable
{
    //...
}

并这样称呼它:

PrintList(spiderList);

因为Tin中的泛型类型参数IEnumerable<T>covariant,所以这将起作用。

在特殊情况下,因为您使用的是.NET 2.0(不支持协变量类型参数),所以该解决方案将不起作用。这是一种解决方法:

创建一个Cast可以在具有不同项目类型的枚举数之间进行转换方法(在.NET 3.5中,我们已经有了诸如扩展方法之类的方法):

public static IEnumerable<U> Cast<T, U>(IEnumerable<T> source) where T : U
{
    foreach (var item in source)
    {
        yield return item;
    }
}

并像这样使用它:

PrintList(Cast<Spider, Creature<IStabAble>>(spiderList));

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

避免传递扩展泛型类的类的泛型类型参数

来自分类Dev

避免传递扩展泛型类的类的泛型类型参数

来自分类Dev

在泛型类型的泛型类上访问类型参数

来自分类Dev

扩展泛型类时如何传递多个泛型参数

来自分类Dev

泛型类使用泛型参数

来自分类Dev

在泛型类隐式类型参数

来自分类Dev

避免泛型类的低调

来自分类Dev

扩展集合泛型类的泛型类

来自分类Dev

泛型类作为参数

来自分类Dev

使用类的实例获取类的泛型类型参数的数量?

来自分类Dev

如何使用泛型返回泛型类的类类型?

来自分类Dev

如何在类中使用扩展的泛型类型的类型?

来自分类Dev

将类型参数作为类型参数的类传递给Java中的泛型方法

来自分类Dev

将类型参数作为类型参数的类传递给Java中的泛型方法

来自分类Dev

强制泛型类型参数为类类型?

来自分类Dev

从泛型类型类确定方法参数类型

来自分类Dev

Scala:引用类的嵌套类型,它是泛型的类型参数

来自分类Dev

泛型类型,其类型参数是抽象基类

来自分类Dev

泛型java函数使用的“类型参数”的“类类型”

来自分类Dev

如何将泛型类扩展为泛型

来自分类Dev

泛型-方法返回类型作为扩展类

来自分类Dev

扩展或为父类的Java泛型类型

来自分类Dev

泛型类型参数C#-如何泛型类返回类型

来自分类Dev

是否可以在限制泛型类型的同时扩展泛型类?

来自分类Dev

Java 泛型:如何扩展另一个泛型类的泛型类

来自分类Dev

通过泛型将类作为参数传递

来自分类Dev

将泛型类型类传递给方法

来自分类Dev

C#将类类型的字典传递给泛型

来自分类Dev

如何在Java中将泛型列表类作为参数传递给泛型方法?

Related 相关文章

热门标签

归档