游戏的类实例或继承的类?最佳做法

时间:2019-02-13 11:01:12

标签: c# performance class inheritance

因此,我正在构建一个小的游戏框架来增强抽象类和接口。我一直在为一些机械师开设课程,但我不确定如何处理最后的部分。

这是类框架(已删除一些其他方法):

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 }

有人可以给我指出最佳实践,还是最有效的方法呢?

1 个答案:

答案 0 :(得分:1)

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

对于实例化方面,如果您不打算突变攻击实例而不是在一个地方创建它们,那是可以的,否则,您需要在实例所在的级别上控制每个攻击实例的生命周期使用。