通过 switch 语句处理对象的集合
本文关键字:集合 对象 处理 switch 语句 通过 | 更新日期: 2023-09-27 18:34:04
我需要让玩家装备一个物品,如下所示:
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..
}
}
我收到一个错误,即开关体验必须是布尔值、字符、字符串、积分、枚举或相应的可为空的类型。
我可以通过在我每个武器/盾牌等类中使用 equit 方法来处理它,并将我的 player
类作为参数传递。但我觉得这有点不合逻辑,因为玩家应该装备物品,而不是装备自己在玩家身上的物品。
你已经有一个界面,为什么不利用它呢?
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
方法。
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
}
由于案例的值必须是常量,因此传统的解决方案是创建一个枚举。
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;
}
}
}