2013-07-16 53 views
0

父類是否可能包含所有子類的列表?父類中的對象列表

我這裏有兩個類,他們是如下

public class Event{ 

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

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

在這種情況下,(主),我可以得出event.First()這可能是一個消息(文本),然後刪除事件。這有什麼問題嗎?這是一個RPG對話系統。 (其他事件將是輸入框等)

+0

http://stackoverflow.com/questions/8928464/for-an-object-can-i-get-all-its-subclasses-using-reflection-or-other-ways 頂答案在這裏似乎有你在找什麼。 –

+0

也許你想把你的事件類型定義爲一個枚舉呢?然後Enum.GetValues和相關的靜態方法應該可以幫助你做這些類型的操作 – Alan

回答

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 
    } 
} 
+0

感謝您的回答,非常有幫助! – user2581885