Hvorfor C# ikke tillater nedarving av returtype ved implementering av et grensesnitt

 C Programming >> C C# Program >  >> C#
Hvorfor C# ikke tillater nedarving av returtype ved implementering av et grensesnitt

OPPDATERING:Dette svaret ble skrevet i 2009. Etter to tiår med folk som foreslår kovarians av returtype for C#, ser det ut til at det endelig vil bli implementert; Jeg er ganske overrasket. Se bunnen av https://devblogs.microsoft.com/dotnet/welcome-to-c-9-0/ for kunngjøringen; Jeg er sikker på at detaljer vil følge.

Denne funksjonen kalles "returtype-kovarians". C# støtter det ikke av følgende årsaker:

1) CLR støtter det ikke. For å få det til å fungere i C#, må vi bare spytte en hel haug med små hjelpemetoder som kaster på returtypen til den rette tingen. Det er ingenting som hindrer deg i å gjøre det selv.

2) Anders mener at returtype-kovarians ikke er et godt språktrekk.

3) \Vi har mange høyere prioriteringer for språket. Vi har bare begrensede budsjetter, og derfor prøver vi å bare gjøre de beste funksjonene vi kan i en gitt utgivelse. Jada, dette ville vært fint, men det er enkelt nok å gjøre på egen hånd hvis du vil. Det er bedre at vi bruker tiden på å legge til funksjoner som forbedrer utvikleropplevelsen eller legger til mer representasjonskraft til språket.


Du kan bruke eksplisitt grensesnittimplementering for å unngå problemet.

class  X : IA, IB
{
  public X test()
  {
    return this;
  }

  IB IA.test()
  {
    return this;
  }
}

interface IA
{
  IB test();
}

interface IB
{
}

Signaturene må samsvare nøyaktig med det grensesnittet spesifiserer. Det er ingen grunn til at du ikke kan returnere en forekomst av X fra metoden, men metodesignaturen må bruke IB .

Som av en rasjonell grunn .. er det sannsynligvis å foretrekke fra et kodelesbarhetssynspunkt.

Du kan implementere grensesnittet eksplisitt, og gi en alternativ signatur som returnerer X som ikke er definert av grensesnittet. Hvis du kjenner din IA er faktisk en X , kan du bruke det i stedet.