您好,我需要一些灵感,
我有一个像这样的航点类:
public class Waypoint<T> {
}
我希望将所有路标添加到一个列表中,如下所示:
var w1 = new Waypoint<Item>();
var w2 = new Waypoint<Player>();
var waypoints = new List<Waypoint<?>>();
问题是,它们并非都是同一类型。 有没有办法可以在一个列表中添加不同的类型?
有人知道一个简单的解决方法吗? 语言:C#
亲切的问候,
毒蛇
答案 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
)。
即使Item
和Player
都来自同一个基类,您也无法定义List<Waypoint<Base>>
并同时添加Waypoint<Item>
和{{1对象到这个列表。
Waypoint<Player>
不是Waypoint<Item>
的派生类型,因为Waypoint<Base>
是Item
的派生类型。