2013-10-06 4 views
3

мне нужно иметь игрока оборудовать пункт, как показано здесь:Обработка коллекций объектов с помощью переключателя заявление

IEquiptable является интерфейсом.

и этот метод находится в моем классе player.

public void equip(IEquiptable equipable) 
    { 
     switch (equipable.GetType()) 
     { 
      case equipable is Weapons: 
       this.weapon = equipable; 
       break; 

      case equipable is Shield: 
       this.shield = equipable 
       break; 

       //etc etc.. 
     } 
    } 

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

Я мог бы справиться с этим, используя метод equit в каждом из классов моего оружия/щита и передать класс player в качестве параметра. Но я чувствую, что это немного нелогично, так как игрок должен экипировать предмет, а не предмет, который экипирует его на игроке.

+0

Используйте операторы 'if'. – SLaks

+0

Какой тип 'Player.weapon' и' Player.shield'? – Jon

ответ

3

У вас уже есть интерфейс, так почему бы вам не воспользоваться им?

public interface IEquipable 
{ 
    void EquipOn(Player player); 
} 

public class Shield : IEquipable 
{ 
    public void EquipOn(Player player) 
    { 
     player.shield = this; 
    } 
} 

public class Weapons : IEquipable 
{ 
    public void EquipOn(Player player) 
    { 
     player.weapon = this; 
    } 
} 

и ваш код становится

public void equip(IEquiptable equipable) 
{ 
    equipable.EquipOn(this); 
} 

В самом деле, вам даже не нужен этот метод, поскольку он сводится лишь к пересылке его работу собственного класса. Каждый раз, когда у вас есть свой IEquipable, вы просто называете его EquipOn.

+0

Это то, что я изначально планировал сделать, просто было немного нелогично, чтобы предмет экипировал его на игроке. – William

+1

Это потому, что вместо двух интерфейсов 'IShield' и' IWeapon' вы решили иметь только один. Зоннеру или позже вам придется нарушать Принцип разделения сегрегации (если вы ставите слишком много разных обязанностей в «IEquipable»), или, если вы этого не сделаете, интерфейс не будет таким же удобным, как и должно быть. Постарайтесь отделить эти обязанности и свой первоначальный дизайн, когда класс 'Player' перегрузил методы оснащения оружия и щитов, снова будет действительным. –

+0

Мои «Оружие» и «Щит» расширяют базовый абстрактный класс «Предмет». Уникальная функциональность как в классе «Оружие», так и «Щит», но я знал, что оба эти предмета могут быть экипированы игроком в немного по-другому, что я считал отличным шансом для интерфейса. Просто мне трудно понять, где поместить логику из интерфейса. – William

1
public void equip(IEquiptable equipable) 
{ 
    var type = equipable.GetType(); 
    if(type is Weapons) 
    { 
    this.weapon = equipable; 
    return; 
    } 
    if(type is Shield) 
    { 
    this.shield = equipable; 
    return; 
    } 
    //etc 
} 
0

Из значений случаев должны быть константами, обычное решение было бы создать перечисления ..

public enum EquippableTypes { 
    Weapons, 
    Shield, 
    Antenna, 
    Underwear 
} 

public partial class Player { 
    public void Equip(IEquippable equippable) { 
     switch(equippable.Type) { 
      case EquippableTypes.Weapons: 
       this.weapon=equippable; 
       break; 

      case EquippableTypes.Shield: 
       this.shield=equippable; 
       break; 

      case EquippableTypes.Antenna: 
       this.antenna=equippable; 
       break; 

      case EquippableTypes.Underwear: 
       this.underwear=equippable; 
       break; 

      // ... 
     } 
    } 

    IEquippable weapon, shield, antenna, underwear; 
} 

Так что ваш Одеваемый интерфейс/классы будут выглядеть ..

public partial interface IEquippable { 
    EquippableTypes Type { 
     get; 
    } 
} 

public partial class Weapons: IEquippable { 
    public EquippableTypes Type { 
     get { 
      return EquippableTypes.Weapons; 
     } 
    } 
} 

public partial class Shield: IEquippable { 
    public EquippableTypes Type { 
     get { 
      return EquippableTypes.Shield; 
     } 
    } 
} 

public partial class Antenna: IEquippable { 
    public EquippableTypes Type { 
     get { 
      return EquippableTypes.Antenna; 
     } 
    } 
} 

public partial class Underwear: IEquippable { 
    public EquippableTypes Type { 
     get { 
      return EquippableTypes.Underwear; 
     } 
    } 
} 
Смежные вопросы