Typescript - вызов метода экземпляра подкласса из базового класса - PullRequest
0 голосов
/ 07 мая 2020

Я создаю проект (небольшую игру) и пытаюсь найти решение своей проблемы.

У меня есть код, в котором я использую базовый класс Entity, который имеет необходимые методы для подклассов (объектов), например движение, рендеринг модели и т. д. c ... Функции, которые используются во всех других подклассах Fe

  • Entity -> Base Class,

    • SpellObject -> Subclass / Extends Entity

    • PlayerObject -> Subclass / extends Entity

    • UnitObject -> Subclass / Extends entity

В сущности у меня есть метод движения по умолчанию, где я проверяю столкновение, но при столкновении я хочу вызвать метод подкласса onCollisionHit, который определен в XXXObject (для каждого объекта мне нужно разделить code)

Мой код

Entity:


class Entity
{
    constructor(obj: EntityInterface)
    {
        ///
    }

    public doMove(...):void
    {
        // SpeedX SpeedY...
        // ...
        if (collisionHit)
            // getSubclass f.e PlayerObject.onCollisionHit()

        this.addPosition(speedX, speedY)
        //...
    }

    // ....

SpellObject / PlayerObject /...


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 из базы класс в этом примере? Одно из возможных решений, которое я нашел, - связать экземпляр подкласса с переменной базового класса

  • в Entity -> protected subclass;

  • в xxxObject -> this.subclass = это; -> в doMove () -> при вызове удара столкновения -> if (this.subclass) this.subclass.onCollisionHit ()

Я не уверен, что это только решение, потраченное впустую память .. Спасибо всем за ответ.

1 Ответ

1 голос
/ 07 мая 2020

Сделайте 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;
    // ....

Затем вы можете использовать, например, this.onCollisionHit() из реализаций метода Entity. Если вам нужно создать экземпляр Entity вместо подкласса, вы можете отказаться от абстрактной идеи и просто использовать стандартную (пустую?) Реализацию onCollisionHit() и подклассы переопределить ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...