Наследование классов для членов - PullRequest
0 голосов
/ 18 октября 2018

У меня есть класс Октри.Ключевой особенностью Octree является то, что он может создавать своих собственных потомков.

class Octree {
  ...
  createChildren(){
    ...
    /* for each of the 8 new children*/
    this.children.push(new Octree(/*someargs*/))
    ...
  }
}

Теперь я хочу наследовать от класса Octree, однако я также хочу, чтобы дети стали унаследованным классом.Например, class LODWorldTree extends Octree, чтобы дополнительно содержать некоторые данные рендера для игры.Однако, если я вызову LODWorldTree.createChildren(), тогда LODWorldTree.children будет массивом Octree с вместо LODWorldTree с.

Каков наилучший способ решить эту проблему?Во время написания этого я смог сохранить Octree.myClass = /*some inherited class*/ и вручную установить эту переменную для всех классов, которые наследуются от Octree.Есть ли лучший способ сделать что-то подобное?Может быть с this.prototype?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Вы можете использовать тот факт, что каждый объект имеет ссылку на свой собственный конструктор через прототип:

class A {
  constructor() {
    this.val = 1;
    this.children = [];
    this.typeName = `I'm A`;
  }
  
  addSelfChild() {
    this.children.push(new this.constructor(this.val + 1));
  }
}

let a = new A(1);
a.addSelfChild();
a.addSelfChild();

console.dir(a);

class B extends A {
  constructor(val) {
    super(val);
    this.typeName = `I'm B`;
  }
}

let b = new B(1);
b.addSelfChild();
b.addSelfChild();

console.dir(b);
0 голосов
/ 18 октября 2018

Попробуйте использовать атрибут constructor:

this.children.push(new this.constructor(/*someargs*/));

this.constructor - это ссылка для конструктора для текущего объекта, поэтому при его вызове будет создан новый экземпляр того же класса

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