如何将具有不同类型的泛型类对象传递给一个List?

时间:2017-06-08 16:27:14

标签: c# list class object generics

您好,我需要一些灵感,

我有一个像这样的航点类:

public class Waypoint<T> {

}

我希望将所有路标添加到一个列表中,如下所示:

var w1 = new Waypoint<Item>();
var w2 = new Waypoint<Player>();
var waypoints = new List<Waypoint<?>>();

问题是,它们并非都是同一类型。 有没有办法可以在一个列表中添加不同的类型?

有人知道一个简单的解决方法吗? 语言:C#

亲切的问候,

毒蛇

3 个答案:

答案 0 :(得分:4)

您可以将Waypoint定义为接口,并让Item和Player实现它,而不是通用基类。这样你就可以得到你想要的IWaypoints列表。

interface IWaypoint
{
    Point GetPosition();//whatever a waypoint should do
}

class Item : IWaypoint
{
    Point location;
    public Point GetPosition()
    {
       return location;
    }
}

class Player : IWaypoint
{
    Point position;
    float movespeed;
    public Point GetPosition()
    {
        return position * movespeed;
    }
}

void main()
{
    List<IWaypoint> waypoints = new List<IWaypoint>();
    waypoints.Add(new Player());
    waypoints.Add(new Item());
    foreach (IWaypoint wp in waypoints)
    {
        Console.WriteLine(wp.GetPosition());
    }
}

答案 1 :(得分:0)

不确定这是否有帮助,但您可以这样做:

struct AbstractWayPoint {};

template<typename T> 
struct WayPoint : AbstractWayPoint {};

std::list<AbstractWayPoint*> theList;

当然,这只是有意义的,如果您想要对列表中的那些路点做什么的界面不依赖于模板参数。然而,这不是乍一看似乎是一个巨大的限制,例如,人们可以这样做:

struct AbstractWayPoint {
    virtual void doSomething(double x) = 0;
};

template<typename T> 
struct WayPoint : AbstractWayPoint {
    virtual void doSomething(double x) {
        T t;
        t.someMethod(x);
    }
};
PS:当我写这个答案时,我认为这个问题是关于C ++的。我只知道很少的C#,所以除非有人指出这样的事情不能在C#中完成,否则我会留下答案。无论如何OP都在寻求一些灵感和#34; ;)

PPS:...顺便说一句,如果您的航点不共享一个共同的界面,那么首先将它们放入列表是否有意义是值得怀疑的。

答案 2 :(得分:0)

假设您使用C#进行编码,Waypoint<Item>Waypoint<Player>除了object之外没有共同的基类,因此集合的类型将是List<object>(甚至是ArrayList)。

即使ItemPlayer都来自同一个基类,您也无法定义List<Waypoint<Base>>并同时添加Waypoint<Item>和{{1对象到这个列表。

Waypoint<Player>不是Waypoint<Item>的派生类型,因为Waypoint<Base>Item的派生类型。