繁体   English   中英

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

[英]How to pass generic class objects with a different type to one List?

您好,我需要一些启发,

我有一个这样的航点类:

public class Waypoint<T> {

}

并且我想将所有航点添加到一个列表中,如下所示:

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

问题是,它们并非都属于同一类型。 有没有一种方法可以将不同类型添加到一个列表中?

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

亲切的问候,

有毒

您可以将Waypoint定义为接口,而不是通用基类,并让Item和Player实现它。 这样,您可以根据需要获得IWaypoint的列表。

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());
    }
}

不知道这是否可以帮助您,但是您可以执行以下操作:

struct AbstractWayPoint {};

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

std::list<AbstractWayPoint*> theList;

当然,如果您要使用列表中的该路标的接口不依赖于template参数,则这才有意义。 但是,乍看之下,这并不是一个很大的限制,例如,一个人可以做这样的事情:

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都在寻求“一些灵感”;)

PPS:...顺便说一句,如果您的航路点没有共享公共接口,恕我直言,将它们放在第一位是否有意义是否值得怀疑。

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

即使ItemPlayer都从同一个基类派生,您也无法定义List<Waypoint<Base>>并将Waypoint<Item>Waypoint<Player>对象都添加到此列表中。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM