gpt4 book ai didi

javascript - Typescript - 从基类调用子类的实例方法

转载 作者:行者123 更新时间:2023-12-02 20:48:54 26 4
gpt4 key购买 nike

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

我有代码,我使用基类实体,它具有子类(对象)的必要方法,例如运动、模型渲染等...在所有其他子类中使用的函数F.e

  • 实体 -> 基类,

    • SpellObject -> 子类/扩展实体

    • 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? 我发现的一种可能的解决方案是将子类实例链接到基类的变量

  • 在实体 -> protected 子类中;

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

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

最佳答案

使 onCollisionHit 成为 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() 的默认(空?)实现并让子类重写它。

关于javascript - Typescript - 从基类调用子类的实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61665250/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com