問題
次のようなコードを避けようとしています。
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に変更されます(おそらく、ローエンドコンピューターの両方をサポートします)。