C#:定义基类中的方法实现和派生类中的属性



我正在做一个游戏,我有很多种士兵,每种士兵都有自己的属性(速度、攻击力…)。显然,他们都可以走路、攻击。。。所以我认为用这些方法创建一个抽象类Soldier,以及每个单元属性的子类是合适的。问题是我不能在基类中使用派生类的属性。

简单的方法可能是在派生类中实现方法,但这意味着会有很多重复的代码,我想避免它。事实上,这会使基类变得不重要。

我试过几种方法。据我所知,我尝试过的最接近的解决方案是使用抽象/虚拟属性,但我会再次为每个单元类型复制"get"代码。也许这是不可避免的,但如果可能的话,我愿意。

肯定存在一个我没有想过的简单解决方案。有什么想法吗?

我想到这样的东西:

public abstract class Soldier {
    public int AttackPower {
        get { return this.power; }
    }
    public Attack {
        Console.WriteLine("Attacked with "+AttackPower+" attack power");
    }
}
public class Lancer:Soldier {
    int power=5;
}
public class Archer:Soldier {
    int power=10;
}

当然,这不是一个正确的解决方案,因为Soldier类不知道"power"变量,但如果我在Soldier类别中声明"power",我会得到一个错误,因为字段名称重复。

任何帮助都将不胜感激。

您需要一个抽象属性:

public int AttackPower {
        get { return this.power; }
    }
protected abstract int Power { get; }
public class Lancer:Soldier {
    protected override int Power { get { return 5; } }
}

如果您真的不喜欢属性,也可以使用"GetPower"方法。正如您所发现的,如果基类方法需要访问数据,则必须在基类中声明该数据。

它不是代码复制,而是类型安全!

为什么不在基类中放入Power属性

public abstract class Soldier {
    public int Power {get; set;}
    public int AttackPower {
        get { return this.Power; }
    }
    public Attack {
        Console.WriteLine("Attacked with "+AttackPower+" attack power");
    }
}
public class Lancer:Soldier {
    public Lancer()
    {
        Power = 5
    }
}
public class Archer:Soldier {
    public Archer()
    {
         Power=10;
    }
}

一些设计意见:

  • ArcherLancer是否需要不同的,或者它们可以只是配置不同的Soldier
  • 最好从数据源中提取这样的属性值,而不是在源代码中对其进行硬编码。您可以嵌入一个XML文件或其他东西,这样它就不容易编辑了

最新更新