如何避免类中的代码重复?

时间:2018-04-04 16:13:07

标签: typescript typescript2.0

我有两个扩展抽象类的类:

   class SubstitutionTeacher extends SubstitutionAbstract {
      abstract _save();
    }

    class SubstitutionFree extends SubstitutionAbstract {
      public _save() {
      }
    }

    class SubstitutionSubject extends SubstitutionAbstract {
      public _save() {
      }
    }

在方法save()中,我意识到自己的行为是这样的:

  /* Class SubstitutionFree
    public _save() {

        const substitutionAdd: ISubstitutionModelTeacher = {
          lesson: this.substitution.lessonNumber,
          confirmed: true,
          subsDate: this.substitution.date,
          newTeacher: this.substitution.teacher
        };

        return this.replaceService.addSubstitution(substitutionAdd);
      }

 /* Class SubstitutionSubject
    public _save() {

        const substitutionAdd: ISubstitutionModelTeacher = {
          lesson: this.substitution.lessonNumber,
          confirmed: true,
          newTeacher: this.substitution.teacher
        };

        return this.replaceService.addSubstitution(substitutionAdd);
      }

正如你所看到的,这两种方法几乎相似。我想避免这种重复:

{ lesson: this.substitution.lessonNumber,
confirmed: true,
newTeacher: this.substitution.teacher
}

我可以将save()更改为常规save()并传递一个共同部分,但它失去了抽象的含义。

1 个答案:

答案 0 :(得分:1)

这可能是无效的打字稿,只是因为我在打字稿中不是那么好:)

但是你的问题不是特定的打字稿,所以也许这会让你知道如何解决这些问题。

SubstitutionAbstract中创建方法:

class SubstitutionAbstract {

    // this one should be called each time you need that object instead of duplicating
    // you can make it protected if there is such stuff in typescript
    public getMyStuff(param1, param2, param3, param4) {
        return { lesson: param1,
                 confirmed: param2,
                 newTeacher: param3,
                 subsDate: param4
               };
    }  
    // .....
}

在每个子类中只需调用它:

public _save() {
    const substitutionAdd: ISubstitutionModelTeacher = 
             getMyStuff(this.substitution.lessonNumber, true, 
                           this.substitution.date, this.substitution.teacher);

    return this.replaceService.addSubstitution(substitutionAdd);
}

如果您在某些实施中不需要subsDate,请将null传递给getMyStuff,不要认为这可能是个问题。 Typescript可能会检查类型等,因此您可能需要使用该方法来进行工作(例如,它应该返回类型为ISubstitutionModelTeacher的东西)。

再次 - 这可能是不能正常工作的代码,因为打字稿不是我的区域,但它描述了你如何做的想法。

确定可能有其他方式,这只是一个例子。

快乐编码:)