Sunrabbit

Covariantie en contravariantie

Aangemaakt: 2024-11-01

Aangemaakt: 2024-11-01 01:06

Deze inhoud komt u vanzelf tegen als u een compilerontwikkelaar bent, of de API van een compiler gebruikt, of als u het typesysteem van een compiler overmatig gebruikt.
Het is iets wat je vanzelf tegenkomt.
Het is iets dat vanzelf in ons coderingsleven verweven is geraakt.

Stel, we hebben twee types, Animal en Dog.

Als een Dog aan een Animal kan worden toegewezen, dan is dat covariantieen

omgekeerd als een Animal aan een Dog kan worden toegewezen, dan is dat contravariantie.

Normaal gesproken kunt u geen Animal aan een Dog toewijzen.

Dat is namelijk niet logisch vanuit het perspectief van de gemiddelde persoon,
dus compilerontwikkelaars houden hier rekening mee en voegen contravariantie alleen toe aan bepaalde delen.

Meestal wordt contravariantie toegepast op de invoerwaarden van een functie, terwijl voor de uitvoerwaarden covariantie wordt gehandhaafd.

Waarom is deze contravariantie nodig?Dat vraagt u zich misschien af.

Het helpt om flexibeler en polymorf te werken, bijvoorbeeld bij event handling.

Covariantie kan juist problemen opleveren.

In bovenstaande code wordt een Animal gebruikt op een plek waar een Dog verwacht wordt, wat flexibiliteit en polymorfisme mogelijk maakt.

Als in plaats van Animal een subtype van Dog, zoals Chiwawa, was gebruikt, zou er een fout optreden bij het uitvoeren van de event handler, omdat Dog geen Chiwawa-specifieke interfaces heeft.

Het lijkt er misschien op dat we een Dog aan een Animal toewijzen, omdat we het type Animal gebruiken bij het uitvoeren van de functie.

Over het algemeen wordt contravariantie vooral gebruikt voor invoerwaarden.

Invariantie, invariantie

Kort gezegd: invariantie is zowel covariantie als contravariantie, en invariantie is geen van beide.

Tot slot

Dit is een onderwerp dat zowel eenvoudig als complex kan zijn, dus

het kan nuttig zijn om dit zelf eens te lezen.




Reacties0