父类中的对象列表

时间:2013-07-16 19:12:12

标签: c# xna

父类是否可以包含所有子类的列表?

我这里有两个班,他们如下

public class Event{

    List<Event> events = new <Event>();
    // etc
}

public class Message : Event{
    string text; 
    // etc
}

在这种情况下,(在Main中)我可以绘制event.First()这可能是一条消息(文本框),然后删除该事件。这有什么问题吗?这是一个RPG对话系统。 (其他事件将是输入框等)

1 个答案:

答案 0 :(得分:0)

使用某种队列

void Main()
{
    Events.Queue(new Message(){ Text = "Hit points +5" });
    Events.Queue(new Message(){ Text = "Hit points +6" });
    Events.Queue(new Message(){ Text = "Hit points +7" });

    while(Events.HasNext())
    {
        Console.WriteLine(Events.GetNext().Text);
    }
}

public static class Events
{
    private static Queue<Message> messages = new Queue<Message>();

    public static void Queue(Message message)
    {
        messages.Enqueue(message);
    }

    public static Message GetNext()
    {
        return messages.Dequeue();
    }

    public static bool HasNext()
    {
        return messages.Count > 0;
    }
}

public class Message
{
    public string Text {get; set;}
}

以更动态的方式,您可以使用接口来构建一个简单的渲染系统。

void Main()
{
    Events.Queue(new Message(){ Text = "Hit points +5" });
    Events.Queue(new Message(){ Text = "Hit points +6" });
    Events.Queue(new ChuckNorris());

    SpriteBatch sb = new SpriteBatch(...);
    while(Events.HasNext())
    {
        Events.GetNext().Render(sb);
    }
}

public static class Events
{
    private static Queue<IRenderable> renderables = new Queue<IRenderable>();

    public static void Queue(IRenderable renderable)
    {
        renderables.Enqueue(message);
    }

    public static IRenderable GetNext()
    {
        return renderables.Dequeue();
    }

    public static bool HasNext()
    {
        return renderables.Count > 0;
    }
}

public interface IRenderable
{
    void Render(SpriteBatch sb);
}

public class Message : IRenderable
{
    public string Text {get; set;}

    public void Render(SpriteBatch sb)
    {
        // ... render code
    }
}

public class ChuckNorris : IRenderable
{
    public void Render(SpriteBatch sb)
    {
        // render code
    }
}