- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是 C# 的新手,我正在开发一个 rpg 游戏引擎。
我有我的基类 Item
,它是 Weapon
和 Armour
的父类,武器和盔甲类有额外的变量,用于统计、武器插槽、盔甲类型等。
我的 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/
据我了解,这是在 C++ 中子类化的唯一方法: class ParentClass { ... } class ChildClass : public ParentClass { ..
在下面的 Java 代码中,我创建了一个列表 nums。我可以在声明期间分配另一个列表。但是除了null 之外不能添加新项目。那么,这是否意味着 nums 是只读的? 为什么?是否可以在该列表中添加新
来自下面的 Java 代码。 ParentClass.this.a 的 TypeScript 等价物是什么 class ParentClass{ int a = 1; class Childr
我是 C# 的新手,我正在开发一个 rpg 游戏引擎。 我有我的基类 Item,它是 Weapon 和 Armour 的父类,武器和盔甲类有额外的变量,用于统计、武器插槽、盔甲类型等。 我的 Play
public class InheritanceDemo { public static void main(String[] args) { ParentClass p =
这个问题在这里已经有了答案: Understanding CSS selector priority / specificity (4 个答案) 关闭 4 年前。
我有几个名为“ParentClass”的类,对于每个父类,我想为任何具有“ParticularClass”类的内部 html 标签修改 css。你如何在 jQuery 中做到这一点? ...
我有课本上的代码: public class Question_3_4 { public static class Inner { private void doIt() {
我有一个这样组织的照片库: .container %li %a{src: image.src} %li %a{src: image.src} %li %a{src:
我正在尝试创建自己的编程语言。该语言的虚拟机 将使用一个数据堆栈,所有对象都将被插入和弹出。 现在,显然,std::stack只允许将相同类型的元素插入其中,因此我创建了一个非常通用的 Obj类将成为
简单的例子: public class Person { String name; } public class VIP extends Person { String title;
我想在我的应用程序中使用 UITableViewCells,它有一个图像,并且该图像是异步下载的。为了实现这一点并确保我不必在我的应用程序中多次编写相同的代码,我将 UITableViewCell 子
它与我正在参与的技术讨论相关。 最佳答案 你说的是 generic covariance - 但不适用于 List ,这是不变。 它确实适用于IEnumerable虽然: IEnumerable ch
我必须将一个 rdd 与其类型相匹配。 trait Fruit case class Apple(price:Int) extends Fruit case class Mango(price:Int
我想知道在从另一个扩展的类中创建对象的这两种方法之间是否存在任何功能差异。 我只是在处理基本的继承,除了 Cat extends Mammal 之类的东西之外没有什么复杂的。 最佳答案 ParentC
当一个类继承自单个类时,调用父方法的首选方式是什么?我知道有两种调用父方法的方法。 选项 1: ParentClass.method(self, *args, **kwargs) 选项 2: supe
我是一名优秀的程序员,十分优秀!