问题
我试图避免如下所示的代码:
If(object Is Man)
Return Image("Man")
ElseIf(object Is Woman)
Return Image("Woman")
Else
Return Image("Unknown Object")
我以为我可以通过方法重载来做到这一点,但它总是选择派生最少的类型,我认为这是因为重载是在编译时确定的(与覆盖不同),因此只能在以下代码中假设基类:
代码结构:
NS:Real
RealWorld (Contains a collection of all the RealObjects)
RealObject
Person
Man
Woman
NS:Virtual
VirtualWorld (Holds a reference to the RealWorld, and is responsible for rendering)
Image (The actual representation of the RealWorldObject, could also be a mesh..)
ArtManager (Decides how an object is to be represented)
代码实现(关键类):
class VirtualWorld
{
private RealWorld _world;
public VirtualWorld(RealWorld world)
{
_world = world;
}
public void Render()
{
foreach (RealObject o in _world.Objects)
{
Image img = ArtManager.GetImageForObject(o);
img.Render();
}
}
}
static class ArtManager
{
public static Image GetImageForObject(RealObject obj)// This is always used
{
Image img = new Image("Unknown object");
return img;
}
public static Image GetImageForObject(Man man)
{
if(man.Age < 18)
return new Image("Image of Boy");
else
return new Image("Image of Man");
}
public static Image GetImageForObject(Woman woman)
{
if (woman.Age < 70)
return new Image("Image of Woman");
else
return new Image("Image of Granny");
}
}
我的场景: 本质上,我正在创建一个游戏,并且想要将现实世界的类(例如一个人)与屏幕上的类(一个人的图像)分离。真实世界的对象不应该知道它在屏幕上的表现,表现需要知道真实的对象(知道这个人的年龄,因此画了多少皱纹)。如果 RealObject 是未知类型,我想要回退,它仍然显示一些东西(比如一个大红十字)。
请注意,此代码不是我使用的,它是一个简化版本,以保持问题清晰。如果适用,我可能需要稍后添加详细信息,我希望此代码的解决方案也能在应用程序中工作。
解决这个问题的最优雅的方法是什么?- 没有 RealObject 本身持有关于它应该如何表示的信息。XNA 游戏是一个概念验证,非常重 AI,如果证明可行,将从 2D 更改为 3D(可能同时支持低端计算机)。