我正在尝试为游戏制作一个基本的“法术系统”,并试图想出一种以模块化方式实现“法术行为”的好方法。我有一个小问题,我希望某些方法只能由某些“类型”的咒语使用。代码示例:
public abstract class Spell
{
public abstract void DoStuff();
public void DoProjectileMovement()
{
//Handle moving spell
//Want to only allow calling from spells which implement "Projectile" interface
}
}
public interface Projectile
{
int projNum { get; set; };
float projSpeed { get; set; };
}
public class Fireball : Spell, Projectile
{
public override void DoStuff()
{
DoProjectileMovement();
}
}
现在,DoProjectileMovement() 方法无法使用 Projectile 接口中的属性,我希望它能够访问该属性。明显的选项似乎只是将其作为参数传递:
public void DoProjectileMovement(Projectile proj)
{
//Handle moving spell
//Now it can access projectile properties through proj
}
但是当在Fireball中调用这个方法时,我必须这样做:
public override void DoStuff()
{
DoProjectileMovement(this);
}
额外的“这个”感觉是多余的。我知道 Projectile 接口永远不会被 Spell 之外的任何其他基类实现。如果它是由 Spell 实现的,我希望能够调用 DoProjectileMovement()。另一种方法是让 DoProjectileMovement 方法在 Projectile 接口中具有默认实现,并以某种方式指定 Projectile 也保证是 Spell。这可能吗?
此外,拥有单独的抽象类“ProjectileSpell”的方法不起作用,因为我希望能够一次使用多个不同的接口。 (比如Fireball也可能是“Exploding”,那么我就不能同时继承“ProjectileSpell”和“ExplodingSpell”这两个抽象类)。
结合基类和接口的属性可以成为在面向对象编程中设计灵活且可重用的代码的有效方法。通过这样做,您可以利用继承(从基类)和接口实现的好处来实现更高级别的抽象和代码组织。