我正在try 为游戏制作一个基本的"拼写系统",并试图想出一种以模块化方式实现"拼写行为"的好方法.我有一个小问题,我希望某些方法只能由某些"类型"的咒语使用.代码示例:
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 int projNum { get; set; }
public float projSpeed { get; set; }
public override void DoStuff()
{
DoProjectileMovement();
}
}
就目前而言,DoProject tileMovement()方法无法使用Project界面中的属性,而我希望它能够访问该界面.显而易见的选项似乎只是将其作为参数传递:
public void DoProjectileMovement(Projectile proj)
{
//Handle moving spell
//Now it can access projectile properties through proj
}
但是当在Fireball中调用这个方法时,我必须这样做:
public override void DoStuff()
{
DoProjectileMovement(this);
}
拥有额外的this
感觉多余.我知道投射接口永远不会由除Spell之外的任何其他Base实现.如果它是由Spell实现的,我希望能够调用DoProjectileMovement().另一种方法是让DoProject tileMovement方法在Project界面中具有默认实现,并以某种方式指定Project tile也保证是一个拼写.这可能吗?
此外,拥有一个单独的抽象类"Project Spell"的方法不起作用,因为我希望能够同时使用多个不同的接口.(例如,Fireball也可能是"Exploding",那么我就不能同时从两个抽象类"OutlotileSpell"和"ExplodingSpell"继承).