【问题标题】:Merging switch statement from different class合并不同类的switch语句
【发布时间】:2018-09-30 18:14:41
【问题描述】:

除了重写函数并手动编写switch 语句或以某种方式复制粘贴switch 之外,有没有办法将来自 2 个不同类但具有相同函数名称的 switch 语句组合成 1 个来自 ClassB 并将其粘贴到来自 ClassA 的 switch 之后?

A类:

protected casesHandler(): void
    {
        switch (case){
            case 0:
                break;
            default:
                super.caseHandler();
        }
    }

B类:

protected casesHandler(): void
    {
        switch (case){
            case 1:
                break;
            default:
                super.caseHandler();
        }
    }

想要的结果:

protected casesHandler(): void
    {
        switch (case){
            case 0:
                break;
            case 1:
                break;
            default:
                super.caseHandler();
        }
    }

尽量避免:

protected casesHandler(): void
    {
        switch (case){
            case 0:
                break;
            default:
                super.caseHandler();
        }

        switch (case){
            case 1:
                break;
            default:
                super.caseHandler();
        }
    }

【问题讨论】:

  • 可以说 ClassA 和 ClassB 实际上是某种插件。两者都扩展了 ClassC。因此视情况而定,将相应地使用 A 类和 B 类。但在某些特殊情况下,插件的两个功能都需要。默认情况下,A 类和 B 类实际上是超回 C 类中的同一个函数。或者现在可以忽略默认值。

标签: javascript typescript merge


【解决方案1】:

没有办法做到这一点,但即使你能做到这一点,它看起来也不像干净的代码。

你可以把这个逻辑隔离成一个简单的函数,然后在你需要的地方导入:

export const casesHandler = (case: number): void => {
  switch (case) {
    case 0:
      // code
    case 1:
      // code
    default:
      // code
  }
}

【讨论】:

    【解决方案2】:

    这些功能并不相似。 super.caseHandler() 中的 super 被硬编码到特定的父类。所以default在这些casesHandler方法中是不同的,覆盖casesHandler并没有错。

    为了实现这一点,可能会有一些遵循某些约定的抽象:

    protected casesHandler(): boolean {
        switch (case) {
            case 0:
                break;
            default:
                return false;
        }
    
        return true;
    }
    
    protected casesWithDefaultHandler(): void
        const isCaseSolved = this.casesHandler();
    
        if (!isCaseSolved)
            super.caseHandler();
    }
    

    然后可以组合几个casesHandler函数。

    【讨论】:

    • 好吧,可以说 ClassA 和 ClassB 实际上是某种插件。两者都扩展了 ClassC。因此视情况而定,将相应地使用 A 类和 B 类。但在某些特殊情况下,插件的两个功能都需要。默认情况下,A 类和 B 类实际上超级回到 C 类中的同一个函数。或者现在可以忽略默认值。
    • 我猜上面代码中的 caseHandler 会起作用。 'default' 动作被排除在外,因此没有什么可以阻止它们的组合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多