Multipel arv

Multipel nedarvning  er en egenskab, der understøttes af en del af objektorienterede programmeringssprog , når en klasse kan have mere end én superklasse (direkte overordnet klasse), understøtter grænseflader multipel nedarvning i mange programmeringssprog. Dette koncept er en udvidelse af "simpel (eller enkelt) arv " ( engelsk  single inheritance ), hvor en klasse kun kan arve fra én superklasse.

Sprog, der understøtter multipel nedarvning inkluderer: Io , Eiffel , C++ , Dylan , Python , nogle JavaScript -klasseimplementeringer (f.eks. dojo .declare ), Perl 6 , Curl , Common Lisp (takket være CLOS ), OCaml , Tcl (takket være Incremental ) Tcl ) [1] , samt Objekt REXX (på grund af brugen af ​​mixin-klasser ).

Oversigt

Multipel nedarvning giver en klasse mulighed for at arve funktionalitet fra mange andre klasser, såsom en klasse StudentMusiciankan arve fra klasse Person, klasse Musicianog klasse Worker, som kan forkortes som:

StudentMusician : Person, Musician, Worker.

Usikkerhed ved multipel nedarvning, som i eksemplet ovenfor, opstår, hvis for eksempel en klasse Musicianarver fra klasser Personog Worker, og klassen Workertil gengæld arver fra Person; en lignende situation kaldes diamantformet arv . Derfor får vi følgende regler:

Arbejder  : Person Musiker  : Person, Arbejder StudentMusiker  : Person, Musiker, Arbejder

Hvis compileren kigger på StudentMusician-klassen, skal den vide, om funktionerne i klasserne skal kombineres eller skal være adskilte. For eksempel ville det være logisk at knytte "Alder" (alder) for Person-klassen til StudentMusician-klassen. En persons alder ændres ikke, hvis du betragter ham som person (person), arbejder (arbejder) eller musiker (musiker). Det ville dog være ret logisk at adskille egenskaben "Navn" i klasserne Person og Musiker, hvis de bruger et kunstnernavn, der er forskelligt fra deres rigtige navn. Indstillingerne for join og split er perfekt gyldige for hver af deres egne sammenhænge, ​​og kun programmøren ved, hvilken mulighed der er korrekt for den klasse, der designes.

Sprog har forskellige måder at håndtere sådanne indlejrede arveproblemer på, for eksempel:

Smalltalk , C# , Objective-C , Java , Nemerle og PHP tillader ikke multipel nedarvning, hvilket undgår mange usikkerheder. Men de, ud over Smalltalk, tillader klasser at implementere flere grænseflader . Derudover giver PHP og Ruby dig mulighed for at efterligne multiple arv gennem brug af mixins (træk i PHP og mixins i Ruby), der ligesom grænseflader ikke er fuldgyldige klasser. Multipel nedarvning af grænseflader giver dig mulighed for at udvide begrænsede muligheder.

Kritik

Multipel arv er blevet kritiseret for følgende problemer på nogle sprog, især C++:

Multipel nedarvning i sprog med C++/Java-stil konstruktører forværrer problemet med konstruktørarv og konstruktørsekvenser, hvilket skaber problemer med vedligeholdelse og udvidelse i disse sprog. Objekter i arveforhold med væsentligt forskellige konstruktionsmetoder er ret svære at implementere inden for konstruktørsekvensparadigmet.

Der er dog sprog, der håndterer disse tekniske detaljer (f.eks. Eiffel ).

Der er en opfattelse af, at multipel arv er et forkert koncept, genereret af forkert analyse og design. Især den følgende designmulighed er gyldig for ovenstående eksempel. Klassen Person omfatter et eller flere objekter fra professionsklassen. Elev- og musikerklasserne arver fra Profession. StudentMusician vil således være repræsenteret af et objekt af klasse Person, der indeholder objekter af klasse Elev og Musiker. Formelt kan multipel nedarvning omvendt konstrueres ved at introducere en klasse, der er en "metaklasse" af de klasser, hvorfra multipel nedarvning skal forekomme. I ovenstående eksempel er en sådan metaklasse Profession - en profession.

Noter

  1. Tcl Advocacy . Hentet 2. december 2009. Arkiveret fra originalen 22. september 2010.
  2. David M. Beazley. Python Essential Reference . — 4. udgave. - Addison-Wesley Professional, 2009. - S.  119 -122. — 717 s. — ISBN 978-0672329784 .
  3. Tcl Manual: klasse . Hentet 2. december 2009. Arkiveret fra originalen 4. april 2009.
  4. Træk: Sammensættelige enheder for adfærd . Hentet 2. december 2009. Arkiveret fra originalen 9. august 2017.

Links

Litteratur