打字稿 - 从基类调用子类的实例方法



我正在构建一个项目(小游戏(,并试图为我的问题找到解决方案。

我有代码使用基类Entity,它对子类(对象((如移动、模型渲染等(有必要的方法。所有其他子类中使用的函数F.e

  • 实体->基类,

    • 拼写对象->子类/扩展实体

    • PlayerObject->子类/扩展实体

    • UnitObject->子类/扩展实体

在实体中,我有默认的移动方法来检查碰撞,但当碰撞被击中时,我想调用XXXObject中定义的子类方法onCollisionHit(对于每个对象,我需要分开的代码(

我的代码

实体:


class Entity
{
constructor(obj: EntityInterface)
{
///
}
public doMove(...):void
{
// SpeedX SpeedY...
// ...
if (collisionHit)
// getSubclass f.e PlayerObject.onCollisionHit()
this.addPosition(speedX, speedY)
//...
}
// ....

拼写对象/播放器对象/。。。


export class xxxObject extends Entity
{
constructor(obj:XXXInterface)
{
// ...
}
public onCollisionHit(...):void
{
// Do something (for SpellObject ->Call spell Disapear, for Player set MovementX/Y to 0..
}

在本例中,如何从基类调用onCollisionHit?我发现的一个可能的解决方案是将子类实例链接到基类的变量

  • 在实体->受保护的子类中;

  • 在xxxObject中->this.subclass=this;->在doMove((->当碰撞命中时调用->if(this.subclass(this.subclasse.onCollisionHit((

我不确定这是否只是浪费内存的解决方案。。感谢大家的回复。

使onCollisionHit成为Entity的抽象方法,并使Entity本身成为抽象方法,因为您似乎希望每个Entity子类都实现该方法,并且可能永远无法实例化一个原始Entity。

abstract class Entity
{
constructor(obj: EntityInterface)
{
///
}
public doMove(...):void
{
// SpeedX SpeedY...
// ...
if (collisionHit)
this.onCollisionHit();
this.addPosition(speedX, speedY)
//...
}
public abstract onCollisionHit():void;
// ....

然后,您可以在Entity方法实现中使用例如this.onCollisionHit()。如果你需要实例化Entity而不是子类,你可以放弃抽象的想法,只使用onCollisionHit()的默认(空?(实现,并让子类覆盖它

最新更新