javascript - Kan jeg endre returtypen til en metode i en utvidet klasse?


Jeg trenger klasse B som utvider grensesnitt C, men jeg vil bruke implementeringen av A::methodA for å beregne resultatet av B::methodA.

interface C {
  methodA(): number
}

class A {
  methodA(): string {
    return '42'
  }
}

class B extends A implements C {
  methodA(): string {
    return Number(super.methodA()).
  }
}

Kan jeg bruke implementeringen av klasse A med arv, eller er assosiasjon mitt eneste håp?

Svar #1

Når du utvikler programvare ved bruk av OO-konstruksjoner (slik som arv), bør du være oppmerksom på SOLID-prinsippene. Disse prinsippene har som mål å gjøre koden din mer forståelig, fleksibel og vedlikeholdbar. De anses generelt å være beste praksis.

Så, mens du kan bruke løsningene foreslått av tidligere svar (f.eks. unionstyper) for å tillate en annen returtype i den overstyrte metoden ... bør du vurdere om dette resulterer i klar, vedlikeholdbar kode.

Spesielt kan dette bryte Liskovs substitusjonsprinsipp, som sier at:

«Objekter i et program bør kunne erstattes med forekomster av deres underordnede typer uten å endre korrektheten til programmet.»

Svar #2

Du kan få metodeA i klasse A til å returnere typen any i stedet for string.

interface C {
   methodA(): number
}

class A {
  protected methodA(): any {
    return '42'
  }
}

class B extends A  implements C {
    methodA(): number {
      return Number(super.methodA());
  }
}