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());
}
}