Проблема
Я пытаюсь избежать кода, который выглядит следующим образом:
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 - это подтверждение концепции, которая очень сложна для ИИ, и, если она окажется выполнимой, будет изменена с 2D на 3D (возможно, с поддержкой обоих типов для компьютеров более низкого уровня).