2015-10-08 6 views
2

Новый программист, используя C# и VB 2015, первый пост, поэтому, пожалуйста, будьте нежны!Доступ к методам дочернего объекта через словарь

В основном я использую словарь в первый раз, и я пытаюсь получить доступ к методу useMedPack(), который находится внутри моего класса MedPack, который является дочерним элементом Item, который создается при добавлении его в словарь. Проблема в том, что он говорит:

**** EDIT **** Мне кажется, что я должен был добавить класс Item в первый раз (теперь добавлен снизу). После некоторых замечательных предложений, я бросил использование инвентаря ((MedPack) [«MedPack»]). UseMedPack(); и теперь он работает по назначению! Хотя некоторые отзывы были замечательными, и я многому научился от всяких предложений! :)

«Пункт» не содержит определения useMedPack() ;.

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Dictionary<String, Item> inventory = new Dictionary<String, Item>(); 

      inventory.Add("MedPack", new MedPack("MedPack", 1)); 

      MedPack.pickUpMedPack(inventory); 

      //THIS IS THE PROBLEM inventory["MedPack"].useMedPack(); 

      Console.WriteLine("Press any key to exit"); 
      Console.ReadKey(); 

     } 
    } 
} 

namespace ConsoleApplication1 
{ 
    class MedPack : Item 
    { 

     private int healthReturn = 10; 

     public MedPack() : base() 
     { 

     } 

     public MedPack(String itemName, int itemQuantity) : base(itemName, itemQuantity) 
     { 

     } 

     public void useMedPack() 
     { 
      decreaseQuantity(1); 
     } 

     public static void pickUpMedPack(Dictionary<String, Item> inventory) 
     { 

      if (!inventory.ContainsKey("MedPack")) 
      { 

       inventory.Add("MedPack", new MedPack("MedPack", 1)); 

       Console.WriteLine("You found a MedPack! It was added to the inventory"); 


      } 
      else 
      { 

       inventory["MedPack"].increaseQuantity(1); 

       Console.WriteLine("You found ANOTHER MedPack! It was added to the inventory"); 

      } 
     } 
    } 
} 

имен ConsoleApplication1 { класс Item {

private String itemName; 
    private int itemQuantity; 


    public Item(String itemName, int itemQuantity) 
    { 

     this.itemName = itemName; 
     this.itemQuantity = itemQuantity; 

    } 

    public Item() 
    { 

    } 

    public void increaseQuantity(int increaseQuantity) 
    { 

     this.itemQuantity += increaseQuantity; 

    } 

    public void decreaseQuantity(int increaseQuantity) 
    { 

     this.itemQuantity -= increaseQuantity; 

    } 


    public String getName() 
    { 

     return this.itemName; 
    } 

    public void setName(String name) 
    { 

     this.itemName = name; 

    } 

    public int getQuantity() 
    { 

     return this.itemQuantity; 
    } 

    public void setQuantity(int x) 
    { 

     this.itemQuantity = x; 

    } 

} 

}

+0

является useMedPack членом товара? –

+0

Почему ваш словарь не из словаря ? –

+0

Вы пробовали кастинг? – Joekomino

ответ

4

словарных хранит объекты типа Item. Нет никакой гарантии, что произвольное Item будет MedPack, поэтому вы не можете напрямую позвонить useMedPack на нем.

Если в вашем случае, вы знаете, что этот элемент является MedPack вы можете просто бросить его:

((MedPack)inventory["MedPack"]).useMedPack(); 

или в две строки:

MedPack mp = (MedPack)inventory["MedPack"]; 
mp.useMedPack(); 

Если во время выполнения , позиция не a MedPack, вы получите исключение.

Если вы хотите, один метод, который может быть применен к всех типов элементов, а затем определить его в Item и переопределить его в подклассы по мере необходимости:

в Item:

public virtual void UseItem() 
{ 
    // base implementtaion 
} 

в MedPack:

public override void UseItem() 
{ 
    // implementation specific to MedPack 
} 
+1

Здесь было бы неплохо отметить, что если вы пытаетесь использовать полиморфизм, лучшим решением было бы добавить метод 'UseItem()' в базовый класс ('Item') и переопределить/реализовать его в производном классе. – tehDorf

+0

@tehDorf Правда, но здесь есть много возможностей для улучшения - «MedPack» имеет статический метод, который принимает «инвентарь» и т. Д. –

+0

Это имеет смысл! Я попробую это, спасибо за совет :) Я по-прежнему в значительной степени нооб, поэтому эти ответы дают мне много усилий для изучения –

Смежные вопросы