我的结构如下:
export class InteriorElement {
private x: number;
public draw(canvas: CanvasRenderingContext2D): void {
throw Error('Draw Method not implemented yet');
}
}
export class Seat extends InteriorElement {
public draw(canvas: CanvasRenderingContext2D): void {
canvas.drawRect(this.x, 0, 20, 20);
}
}
我可以使用以下命令生成一个新对象:
const seat: Seat = new Seat();
seat.x = 5;
能用座位的抽奖方法
seat.draw(this.canvasContext);
现在,为了避免一遍又一遍地修改同一个座位,我想深入复制这个元素。但是,与其将方法复制/粘贴给每个孩子,我宁愿只使用IntersideElement类。因此,我希望有一个功能(我们非常邀请您改进该函数),如下所示:
public deepCopy(): InteriorElement {
const deepCopy: InteriorElement = new InteriorElement(this.id);
Object.keys(this).forEach((key: string) => {
if (typeof (this[key]) === 'object') {
return this.deepCopyObject(this[key]);
} else {
deepCopy[key] = this[key];
}
});
return deepCopy;
}
private deepCopyObject(any: any): object {
const deepCopy: object = new Object();
Object.keys(any).forEach((key: string) => {
if (typeof (any[key]) === 'object') {
return this.deepCopyObject(any[key]);
} else {
deepCopy[key] = any[key];
}
});
return deepCopy;
}
我现在可以使用一个简单的:
seat.deepCopy();
然而,问题在于这显然会返回一个InsideElement。所以这样做:
const seat2: Seat = seat.deepCopy();
seat2.draw();
将导致“绘制方法尚未实现”错误。即使const是键入的,它也会收到一个InsideElement,所以从现在开始它将是一个。
有没有办法为deepCopy提供泛型类型?像这样:
const seat2: Seat = seat.deepCopy<Seat>();
这将导致:
public deepCopy<T>(): T {
const object: T = new T();
[...]
}
不幸的是,它抛出了:“T”仅指一种类型,但在这里被用作值 - 错误。我如何知道InsideElement.deepCopy()副本请求哪个子项?
智慧大石
相关分类