我正在制作一个游戏,其中我有多种士兵,每种都有自己的属性(速度,攻击力......)。显然,所有这些都可以走路,攻击......所以我认为用这些方法创建一个抽象类Soldier,以及每个单元属性的子类都是合适的。问题是我不能在基础类中使用派生类的属性。
简单的方法可能是在派生类中实现方法,但这意味着许多重复的代码,我想避免它。实际上,这会使基类不必要。
我尝试过几件事。据我所知,我尝试的最接近的解决方案是使用抽象/虚拟属性,但我再次复制每个单元类型的“获取”代码。也许这是无法避免的,但我想,如果可能的话。
肯定存在一个我没有想过的简单解决方案。 ¿有什么想法吗?
我想到这样的想法:
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”变量,我会收到错误,因为字段名称是重复的。
任何帮助将不胜感激。
答案 0 :(得分:4)
您需要一个抽象属性:
public int AttackPower {
get { return this.power; }
}
protected abstract int Power { get; }
public class Lancer:Soldier {
protected override int Power { get { return 5; } }
}
如果你真的不喜欢属性,你也可以做一个“GetPower”方法。正如您所发现的,如果基类方法需要访问数据,您有在基类中声明该数据。
它不是代码重复,它的类型安全!
答案 1 :(得分:2)
为什么不在基类中放置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;
}
}
一些设计评论:
Archer
和Lancer
的不同类,或者它们只是Soldier
配置不同?