这段代码中,类的继承关系如何优化,来尽可能避免出现类型转换?
简化后的代码如下
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