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

简化后的代码如下
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的项”。“项”的大部分功能是一致的,Item2比Item1多了了一些属性和方法。
ItemSet表示“项集”,Item1Set的kernel装的均为Item1,Item2Set的kernel装的均为Item2。
我想比较两个Item2Set是否相似,需要调用kernelSimilar方法。而kernelSimilar方法需要调用Item2的similar方法。这使得我需要进行类型转换。当我的Item2和Item2Set特有属性和方法有多个时,我需要写很多的类型转换。
如果我在Item1Set和Item2Set中分别也声明了类型为Array<Item1>和Array<Item2>的kernel,那么我又需要为Item1Set和Item2Set分别写一段重复的构造函数(假设构造函数很复杂),我感觉这个方式也不太好。
请问应该如何优化这段代码来尽可能避免过多的类型转换?
回答:
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

