Перегрузка с иерархией классов - большинство производных не используется

Проблема

Я пытаюсь избежать кода, который выглядит следующим образом:

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 (возможно, с поддержкой обоих для компьютеров младшего уровня).

6
задан Cœur 22 January 2017 в 15:23
поделиться