gpt4 book ai didi

c# - DerivedClass 作为 ParentClass 类型变量的值

转载 作者:太空宇宙 更新时间:2023-11-03 19:42:15 25 4
gpt4 key购买 nike

我是 C# 的新手,我正在开发一个 rpg 游戏引擎。

我有我的基类 Item,它是 WeaponArmour 的父类,武器和盔甲类有额外的变量,用于统计、武器插槽、盔甲类型等。

我的 Player 类:

class Player{
Armour helmet;
Armour chest;
Weapon mainHand;
Item offHand;

这是我将一个元素装备到他相应的插槽中的方法(setter 方法)

    void equipItem(Item pz)
{
switch (pz)
{
case Weapon w when (w.weaponType == WeaponType.OneHandWeapon):
mainHand = pz; // Cannot convert-to-Type Error *
break;
case Weapon w2 when (w2.weaponType == WeaponType.TwoHandWeapon):
mainHand = pz; // **
toInventory(offHand);
offHand = null;
case Armour a when (a.armourType == ArmourType.Chest):
chest = pz; // **
break;
case Armour a when (a.armourType == ArmourType.Helmet):
helmet = pz; // **
break;
default:
break;
}
}
void equipOffhand(Item pz)
{
if (mainHand.weaponType != WeaponType.TwoHandWeapon)
{
offHand = pz;
}
else
{
//error cannot equip off hand while wielding 2handWeapon
}
}

非常简单的模型。

我要实现的是

var ss = new Weapon()
{
weaponType= WeaponType.oneHandedWeapon,
};
equipItem(ss);
equipOffHand(ss);

但是如何摆脱类型转换错误呢?

最佳答案

通过适当的面向对象设计,您不需要枚举来告诉您项目属于哪里,也不需要 switch case 语句来触发正确的一个——即 code smell。 .

选择插槽是一种行为。您继承和覆盖的行为和多态性通过记住对象的类型来处理其余的事情。这种方法不仅为您提供了更结构化的代码,而且性能也会更好(更少的 CPU、更好的分支预测等)。

这是一个简单的例子,应该能满足你的大部分需求:

abstract class Item
{
public abstract void Equip(Player player);
}

abstract class Armour : Item
{
}

class ChestPlate : Armour
{
public override void Equip(Player player)
{
player.Chest = this;
}
}

class Helm : Armour
{
public override void Equip(Player player)
{
player.Helmet = this;
}
}

class Weapon : Item
{
public override void Equip(Player player)
{
player.MainHand = this;
}
}

class OneHandedWeapon : Weapon
{
}

class TwoHandedWeapon : Weapon
{
public override void Equip(Player player)
{
player.Offhand = player.MainHand = this;
}
}

class Player
{
public Armour Helmet { get; set; }
public Armour Chest { get; set; }
public Weapon MainHand { get; set; }
public Item Offhand { get; set; }
}

现在如果你想装备一个元素,你只需要这样做:

item.Equip(player);

这是一个 link to a working example on DotNetFiddle这更多地展示了它是如何工作的。

关于c# - DerivedClass 作为 ParentClass 类型变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51832778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com