这段代码中,类的继承关系如何优化,来尽可能避免出现类型转换?

简化后的代码如下

abstract class Item {

p1: number = 0;

abstract equal(other: Item): boolean;

// 省略公有实现的方法

}

class Item1 extends Item {

override equal(other: Item1): boolean {

return this.p1 === other.p1;

};

}

class Item2 extends Item1 {

p2: string = "";

override equal(other: Item2): boolean {

return this.p1 === other.p1 && this.p2 === other.p2;

}

similar(other: Item2): boolean {

return this.p2 === other.p2;

}

}

abstract class ItemSet {

kernel: Array<Item>;

constructor(kernel: Array<Item>) {

this.kernel = kernel;

}

kernelEqual(other: ItemSet): boolean {

for (let i = 0; i < this.kernel.length; i++) {

if (!this.kernel[i].equal(other.kernel[i])) {

return false;

}

}

return this.kernel.length === other.kernel.length;

};

}

class Item1Set extends ItemSet {}

class Item2Set extends ItemSet {

kernelSimilar(other: Item2Set): boolean {

for (let i = 0; i < this.kernel.length; i++) {

// 这里需要进行类型转换

if (!(this.kernel[i] as Item2).similar(other.kernel[i] as Item2)) {

return false;

}

}

return this.kernel.length === other.kernel.length;

}

}

Item表示“项”,Item1为“Level1的项”,Item2为“Level2的项”。“项”的大部分功能是一致的,Item2Item1多了了一些属性和方法。

ItemSet表示“项集”,Item1Setkernel装的均为Item1,Item2Setkernel装的均为Item2

我想比较两个Item2Set是否相似,需要调用kernelSimilar方法。而kernelSimilar方法需要调用Item2similar方法。这使得我需要进行类型转换。当我的Item2Item2Set特有属性和方法有多个时,我需要写很多的类型转换

如果我在Item1SetItem2Set中分别也声明了类型为Array<Item1>Array<Item2>kernel,那么我又需要为Item1SetItem2Set分别写一段重复的构造函数(假设构造函数很复杂),我感觉这个方式也不太好。

请问应该如何优化这段代码来尽可能避免过多的类型转换?


回答:

abstract class ItemSet<T extends Item> {

kernel: Array<T>;

constructor(kernel: Array<T>) {

this.kernel = kernel;

}

kernelEqual(other: ItemSet<T>): boolean {

for (let i = 0; i < this.kernel.length; i++) {

if (!this.kernel[i].equal(other.kernel[i])) {

return false;

}

}

return this.kernel.length === other.kernel.length;

};

}

kernel array 可以提成泛型

class Item2Set extends ItemSet<Item2>

class Item1Set extends ItemSet<Item>

以上是 这段代码中,类的继承关系如何优化,来尽可能避免出现类型转换? 的全部内容, 来源链接: utcz.com/p/944289.html

回到顶部