2012-06-09 4 views
0

Прежде чем попасть на мой вопрос, вот пример структуры моего кода:Вызов метода подкласса из списка объектов базового класса?

abstract class Entity 
{ 
    #region Declarations 
    public string Name; 
    public string Description; 
    #endregion 

    #region Constructor 
    public Entity(string Name, string Description) 
    { 
     this.Name = Name; 
     this.Description = Description; 
    } 
    #endregion 
} 

abstract class Item : Entity 
{ 
    #region Declarations 
    public bool SingleUse; 
    #endregion 

    #region Constructor 
    public Item(string Name, string Description, bool SingleUse = false) 
     :base(Name, Description) 
    { 
     this.SingleUse = SingleUse; 
    } 
    #endregion 

    #region Public Methods 
    public void NoUse() 
    { 
     Program.SetError("There is a time and place for everything, but this is not the place to use that!"); 
    } 
    #endregion 
} 

class BrassKey : Item 
{ 
    public BrassKey(string Name, string Description, bool SingleUse = false) 
     :base(Name, Description, SingleUse) 
    { 
    } 

    public void Use() 
    { 
     if (Player.Location == 2) 
     { 
      Program.SetNotification("The key opened the lock!"); 
      World.Map[2].Exits.Add(3); 
     } 
     else 
     { 
      NoUse(); 
      return; 
     } 
    } 
} 

class ShinyStone : Item 
{ 
    public ShinyStone(string Name, string Description, bool SingleUse = false) 
     : base(Name, Description, SingleUse) 
    { 
    } 

    public void Use() 
    { 
     if (Player.Location == 4) 
     { 
      Player.Health += Math.Min(Player.MaxHealth/10, Player.MaxHealth - Player.Health); 
      Program.SetNotification("The magical stone restored your health by 10%!"); 
     } 
     else 
     { 
      Program.SetNotification("The shiny orb glowed shiny colors!"); 
     } 
    } 
} 

class Rock : Item 
{ 
    public Rock(string Name, string Description, bool SingleUse = false) 
     : base(Name, Description, SingleUse) 
    { 
    } 

    public void Use() 
    { 
     Program.SetNotification("You threw the rock at a wall. Nothing happened."); 
    } 
} 

Я тогда построить список Item объектов в моем World классе. Каждый объект в списке имеет тип элемента, которым он является.

public static List<Item> Items = new List<Item>(); 

private static void GenerateItems() 
{ 
    Items.Add(new BrassKey(
     "Brass Key", 
     "Just your generic key thats in almost every game.", 
     true)); 

    Items.Add(new ShinyStone(
     "Shiny Stone", 
     "Its a stone, and its shiny, what more could you ask for?")); 

    Items.Add(new Rock(
     "Rock", 
     "It doesn't do anything, however, it is said that the mystical game designer used this for testing.")); 
} 

Как я мог бы вызвать метод использования каждого конкретного класса элемента, как это:

World.Items[itemId].Use(); 

Если есть что-то вы не понимаете, о моей проблеме, пожалуйста, не стесняйтесь обращаться к нам меня!

ответ

4

Определите способ использования в ItemClass и пометьте его виртуальным. Затем в ваших подклассах отметьте метод как переопределяющий и вы сможете делать то, что хотите.

+0

Это сработало отлично. Спасибо! –

+0

отметьте ответ на этот вопрос. Зеленый флажок слева. :) –

+0

Я собираюсь :) StackOverflow требует, чтобы я подождал несколько минут, прежде чем я смогу его принять. –