Как использовать это и супер в полиморфизме в JS ES6 - PullRequest
0 голосов
/ 19 апреля 2019

Я хочу иметь 3 класса, которые связаны между собой.A Node class a DoorNode class и SisterDoorNode class.

Существуют различные типы узлов, у всех из которых есть id, позиция, соединения и несколько функций.

Один из этих типов - это дверные узлы, которые, как и родственные дверные узлы, имеют тип узла "дверь", соответствующий элемент и несколько функций.Их идентификатор и позиция рассчитываются одним способом.

Тогда есть также сестринские дверные узлы.У них есть другой способ вычисления идентификатора и позиции, а также логическое значение, в котором говорится, что они являются сестринскими дверными узлами.

Вот как я хотел, чтобы это выглядело:

class Node {
    constructor(id, pos) {
        this.id = id;
        this.pos = pos;
        this.connections = [];
    }

    addConnection(c) {
        //A few functions all nodes need
    }
}

class DoorNode extends Node {
    constructor(door) {
        //Both of these are needed for all Nodes but are calculated in a different way for DoorNode and SisterDoorNode
        let id = this.getId(door);
        let pos = this.getPos(door);
        super(id, pos);

        //Both of these are needed in SisterDoorNode and DoorNode
        this.nodeType = "door";
        this.correspondingElement = door;
    }

    getId(door) {
        return door.id;
    }

    getPos(door) {
        return door.pos;
    }

    getDoorSize() {
        //Some calculations I need for both DoorNode + SisterDoorNode
    }
}

class SisterDoorNode extends DoorNode {
    constructor(door) {
        super(door);
        this.isSisterNode = true;
    }

    getId(door) {
        return door.id + ".2";
    }

    getPos(door) {
        return new Point(door.pos.x + 10, door.pos.y + 10);
    }
}

но так как я не могу использовать this до super () , это не работает.Как лучше всего решить эту проблему?

1 Ответ

1 голос
/ 19 апреля 2019

Итак, вы не в состоянии использовать 'this' до 'super', поскольку нет ссылки на 'this' до завершения работы конструктора базового класса.

Есть несколько решений для этого, но они включают реструктуризацию вашего кода.

1) передайте id и pos как параметры, как это делает базовый класс.

2) Создать getId и getPos статические методы. (это создаст новые сложности с использованием статических переменных)

3) сделать необязательными pos и id и установить их через некоторое время после супер-вызова.

4) Вы можете просто ссылаться на реквизит напрямую; super( door.id, door.pos ), но это не сработает в вашем расширенном классе, который выполняет логику на id и pos

Обновление, чтобы включить пример использования статической функции с супер вызовом.

class Foo {
    constructor(door) {
        super( Foo.GetNodeFromDoor( door ) );
        // can now use `this`
    }
    
    
    static GetNodeFromDoor( door ) {
      // `this` refers to the static namespace, and not to the instance of the class. 
      return {
        id: door.id + ".2",
        pos: new Point(
          door.pos.x + 10,
          door.pos.y + 10
        )
      }
    }
}
...