我有一个继承层次结构,在该层次结构中,对象可以使用某些值和由各种构造函数提供的某些默认值正常构造,或者可以通过提供所有值的序列化形式构造。我想用我在每个类上定义的静态工厂方法处理序列化表单的构造。像这样:
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
}
}
问题是:如何实现这些方法?而且,最好将它们的工作分担给超类静态工厂方法。
答案 0 :(得分:0)
这是一个很自以为是的主题(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);