Как обрабатывать статические фабричные методы в дереве наследования - PullRequest
0 голосов
/ 10 марта 2019

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

class A {
  constructor(x: number) {
     this.x = x;
  }

  static fromValues(v: {x: number}) {
    return new A(v.x);
  }
}

class B extends A {
  constructor(y: number) {
    super(0);
    this.y = y;
  }

  static fromValues(v: {x: number, y: number}) {
    // what goes here
  }
}

class C extends B {
  constructor(z: number) {
    super(0, 1);
    this.z = z;
  }

  static fromValues(v: {x: number, y: number, z: number}) {
    // what goes here
  }
}

Вопрос: как мне реализовать эти методы?Кроме того, желательно, чтобы они перекладывали некоторую работу на статические фабричные методы суперкласса.

1 Ответ

0 голосов
/ 10 марта 2019

Это очень самоуверенная тема (фабрики в JavaScript).Решение ниже предоставляется в натуральной форме (написано как ваш вопрос), чтобы дать прямой ответ без мнения о других методах.

Примечание наборы удалены из-за ограничений инструмента сниппета.

Изменения включают добавление значений по умолчанию в список параметров конструктора.Это позволяет удалить жестко закодированные значения и при необходимости предоставить значения для конструкторов подкласса.Кроме того, по умолчанию требуются значения по умолчанию в ваших статических методах.

Это позволяет создавать отдельные объекты или всю иерархию либо с помощью статического фабричного метода, либо с помощью ключевого слова new.

class A {
  constructor(x = 0) {
    this.x = x;
  }

  static fromValues(v = {x:0}) {
    return new A(v.x);
  }
}

class B extends A {
  constructor(y = 0, x) {
    super(x);
    this.y = y;
  }

  static fromValues(v = {y:0, x:0}) {
    return new B(v.y, v.x)
  }
}

class C extends B {
  constructor(z = 0, y, x) {
    super(y, x);
    this.z = z;
  }

  static fromValues(v = {z:0, y:0, x:0}) {
    return new C(v.z, v.y, v.x);
  }
}

const a = A.fromValues({x: 3});
const b = B.fromValues({y: 2,x: 3});
const c = C.fromValues({z: 1,y: 2,x: 3});
const nv = C.fromValues();

console.log("A", a);
console.log("B", b);
console.log("C", c);
console.log("No Values", nv);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...