En programmation orientée objet (POO), une classe abstraite est une classe si et seulement si elle n'est pas instanciable. Elle sert de base à d'autres classes dérivées (héritées).

Le mécanisme des classes abstraites permet de définir des comportements (méthodes) dont l'implémentation (le code dans la méthode) se fait dans les classes filles. Ainsi, on a l'assurance que les classes filles respecteront le contrat défini par la classe mère abstraite.

En TS on la declare avec le mot clef abstract

En JS une classe abstraite est une classe qui ne contient pas de constructor()

Exemple sur emedisys

Base-component.ts

Base-view-component.ts

Nulle part dans l’appli on fait un new Base-view-component

Par contre on va pouvoir les étendre dans plusieurs composants pour récupérer le bon “moule”, donc les propriétés et méthodes declarées dans la classe abstraite


// BASE-VIEW-COMPONENT
/**
 * Fonction permettant de test les formulaires avant fermeture
 * @param a_event Event de click de fermeture
 */
public onCloseClick(a_event : MouseEvent) : boolean {
  a_event.preventDefault();
  let l_result=true;
  if (this.coreServicesProvider.formsService.getFormsModified(this.forms)) {
    l_result=confirm(this.coreServicesProvider.libelleService.getCoreLib("core.common.msg.ChgRouteLib"));
  }
  return l_result;
}

/**
 * gestion du new
 * @param a_event
 */
public onNewClick(a_event : MouseEvent) : boolean {
  a_event.preventDefault();
  if (this.viewParams.createModalParams) {
    if (this.viewParams.createModalParams.dataParams) {
      this.viewParams.createModalParams.dataParams.dataType=ViewDataType.CREATE;
    }
    this.modalService.showModal(this.viewParams.createModalParams.modalComponent,this.viewParams.createModalParams.dataParams,this.viewParams.createModalParams.data,this.viewParams.createModalParams.class).subscribe(
      result => {
        // s'il y a un résultat
        if ((<any>result).modalResult!==MsModalResult.KO) {
          // si pas de prochain state
          if (!(this.viewParams.createModalParams.afterSaveState)) {
            // si une liste existe
            if ((this["tableRef"])) {
              // mise à jour de la liste
              this["tableRef"].doLoadData(true);
            }
          } else { // si on a défini un state après sauvegarde(création dans ce cas)
            if ((this.viewParams.createModalParams.dataParams) && (<any>result).data) {
              this.goToNextStateAfterCreate(this.viewParams.createModalParams, (<any>result).data);
            }
          }
        } else { // si pas de résultat
          return; // rien
        }
      }
    )
  } else {
    this.coreServicesProvider.urlService.goToCreate(undefined,undefined,a_event);
  }

  return true;
}

Puis BASE-MODAL va etendre la classe abstraite BaseView

@Directive()
export abstract class BaseModalComponent<SingleBean,ListBean> extends BaseViewComponent<SingleBean,ListBean> implements OnInit,BaseModalInterface {
    
    constructor(coreServicesProvider : CoreServicesProvider,
        a_bsModalRef?: BsModalRef,
        a_viewParams? : ViewParams,
        a_service?: BaseListHttpService<ListBean> | BaseHttpService<SingleBean, ListBean>,
        a_modalService? : MsModalService) {
        super(coreServicesProvider,a_viewParams,a_service,a_modalService);
        this.bsModalRef=a_bsModalRef;        
    }    
   
    /**
     * Fonction permettant de test les formulaires avant fermeture
     * @param a_event Event de click de fermeture
     */
// OVERRIDE methode parent pour inclure specificité des modales
    public onCloseClick(a_event : MouseEvent) : boolean {
        let l_result=super.onCloseClick(a_event);
        if (l_result) {
            this.modalResult=MsModalResult.KO;
            this.bsModalRef.hide();
        }
        return l_result;
    }

      public callbackDEFAUT(a_result : HttpResponse<HttpPostResult<any>>,a_data:any,a_action:MsAction,a_event? : MouseEvent,a_type? : MsActionType) {
        this.modalResult=MsModalResult.ACTION;
        this.bsModalRef.hide();
      }      
  
    ngOnInit() {
        super.ngOnInit();
    }
}