[英]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
)。
即使Item
和Player
都从同一个基类派生,您也无法定义List<Waypoint<Base>>
并将Waypoint<Item>
和Waypoint<Player>
对象都添加到此列表中。
Waypoint<Item>
不是Waypoint<Base>
的派生类型,仅因为Item
是Base
的派生类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.