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

简化后的代码如下

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分别写一段重复的构造函数(假设构造函数很复杂),我感觉这个方式也不太好。

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

阅读 1.2k
1 个回答
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>
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题