【问题标题】:Class Instance or Inherited Class for a game? Best Practice游戏的类实例或继承类?最佳实践
【发布时间】:2019-02-13 11:01:12
【问题描述】:

所以我正在构建一个小型游戏框架来强化抽象类和接口。我一直在为一些机制构建课程,但我不知道如何处理最后的部分。

这是类框架(删除了一些杂项方法):

public abstract class Ability
{
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual string Type { get; set; }
    public virtual string Stat { get; set; }
    public virtual float Scale { get; set; }
    public virtual float MPCost { get; set; }
    public virtual float SPCost { get; set; }
}

public class Attack : Ability
{
    public float BaseDmg { get; set; }
    public bool isUnblockable { get; set; }

    public float GetDmg(int stat)
    {
        return BaseDmg * (1 + stat * Scale);
    }
}

现在对于我想要创建的实际攻击,我应该像以前一样实例化吗?

public static class AllAttacks
{
    //Physical Attacks
    public static Attack slash = new Attack();

    //Magical Attacks
    public static Attack push = new Attack();

    public static void Generate()
    {
        //Physical Attacks
        slash.Name = "Slash";
        slash.Description = "A simple but effective strike.";
        slash.Type = "physical";
        slash.Stat = "str";
        slash.Scale = 0.1F;
        slash.MPCost = 0;
        slash.SPCost = 1;
        slash.BaseDmg = 5;
        slash.isUnblockable = false;

        //Magical Attacks
        push.Name = "Push";
        push.Description = "A powerful telekinetic strike.";
        push.Type = "magic";
        push.Stat = "int";
        push.Scale = 0.1F;
        push.MPCost = 1;
        push.SPCost = 0;
        push.BaseDmg = 5F;
        push.isUnblockable = false;
    }

或者我应该为每个独特的项目创建一个新的继承类,然后在 Fight 类中实例化它们?如果我这样做,这些应该是静态的还是非静态的?

public class Slash : Attack { //Code Here }

谁能指出最佳实践或最有效的方法是什么?

【问题讨论】:

  • 您可能想阅读 Eric Lippert 的 Wizards and Warriors series。如果您不想全部阅读,请跳至第 5 部分,其中包含真正的要点。
  • 这使您的问题过于宽泛。没有适合所有人的通用规则。
  • @HimBromBeere 真的吗?我有一门课通过将攻击传递给他们来处理战斗。我应该像现在一样将攻击作为类实例,还是应该为我想要的每种攻击创建新类。究竟什么太宽泛了?如有必要,我会改写我的问题。

标签: c# performance class inheritance


【解决方案1】:

定义一个新类通常有两个主要原因:新行为和/或新合同,即为前一个原因更改实现或为后者添加新的公共成员。现在考虑您的示例,我看不到各种攻击类型的合同或行为发生了变化(仅更改了状态),因此我看不到为它们定义新类的理由。然而,从可读性的角度来看,Generate 方法并不是最优的——我会为不同类型的攻击创建单独的方法,这将清楚地表明它们创建的攻击类型。

至于实例化方面,如果你不打算改变你的攻击实例而不是在一个地方创建它们是很好的,否则你需要在实例所在的级别控制每个攻击实例的生命周期被使用了。

【讨论】:

  • 谢谢,这是我一直在寻找的建议和指导。
  • @Arcaster,作为旁注,尽量避免实例化和初始化分离,因为有可能获得半初始化实例和一些使用不便。我的建议是使用静态工厂方法,该方法将返回已设置所有属性的初始化实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多