Multipelt arv

Multipelarv  är en egenskap som stöds av delar av objektorienterade programmeringsspråk , när en klass kan ha mer än en superklass (direkt överordnad klass), stöder gränssnitt multipelt arv i många programmeringsspråk. Detta koncept är en förlängning av "enkelt (eller enstaka) arv " ( Engelska  enkelarv ), där en klass bara kan ärva från en superklass.

Språk som stöder flera arv inkluderar: Io , Eiffel , C++ , Dylan , Python , vissa JavaScript -klassimplementeringar (t.ex. dojo .declare ), Perl 6 , Curl , Common Lisp (tack vare CLOS ), OCaml , Tcl (tack vare Incremental ) Tcl ) [1] , såväl som Object REXX (på grund av användningen av mixin-klasser ).

Översikt

Multipelt arv tillåter en klass att ärva funktionalitet från många andra klasser, till exempel en klass StudentMusiciankan ärva från klass Person, klass Musicianoch klass Worker, som kan förkortas som:

StudentMusician : Person, Musician, Worker.

Osäkerhet vid multipelarv, som i exemplet ovan, uppstår om till exempel en klass Musicianärver från klasser Personoch Worker, och klassen Workeri sin tur ärver från Person; en liknande situation kallas diamantformad arv . Därför får vi följande regler:

Arbetare  : Person Musiker  : Person, Arbetare StudentMusiker  : Person, Musiker, Arbetare

Om kompilatorn tittar på StudentMusician-klassen måste den veta om funktionerna i klasserna ska kombineras eller vara separata. Till exempel skulle det vara logiskt att koppla "Ålder" (ålder) för klassen Person till klassen StudentMusician. En persons ålder ändras inte om du betraktar honom som person (person), arbetare (arbetare) eller musiker (musiker). Det skulle dock vara ganska logiskt att separera egenskapen "Namn" i klasserna Person och Musiker om de använder ett artistnamn som skiljer sig från deras riktiga namn. Alternativen för join och split är helt giltiga för var och en av deras egna sammanhang, och bara programmeraren vet vilket alternativ som är korrekt för klassen som designas.

Språk har olika sätt att hantera sådana kapslade arvsproblem, till exempel:

Smalltalk , C# , Objective-C , Java , Nemerle och PHP tillåter inte multipelt arv, vilket undviker många osäkerheter. Men de, förutom Smalltalk, tillåter klasser att implementera flera gränssnitt . Dessutom låter PHP och Ruby dig emulera multipla arv genom användning av mixins (egenskaper i PHP och mixins i Ruby), som, liksom gränssnitt, inte är fullfjädrade klasser. Flera arv av gränssnitt gör att du kan utöka begränsade möjligheter.

Kritik

Multipelt arv har kritiserats för följande problem på vissa språk, särskilt C++:

Multipelt arv i språk med konstruktörer i C++/Java-stil förvärrar problemet med konstruktörsarv och konstruktorsekvenser, vilket skapar problem med underhåll och utökbarhet i dessa språk. Objekt i arvsrelationer med väsentligt olika konstruktionsmetoder är ganska svåra att implementera inom konstruktorsekvensparadigmet.

Det finns dock språk som hanterar dessa teknikaliteter (t.ex. Eiffel ).

Det finns en åsikt att multipelt arv är ett felaktigt koncept, genererat av felaktig analys och design. I synnerhet gäller följande designalternativ för exemplet ovan. Klassen Person inkluderar ett eller flera objekt av klassen Profession. Student- och musikerklasserna ärver från Profession. Således kommer StudentMusician att representeras av ett objekt av klassen Person som innehåller objekt av klassen Student och Musiker. Formellt kan multipelt arv omvändas genom att introducera en klass som är en "metaklass" av de klasser från vilka multipelt arv ska ske. I exemplet ovan är en sådan metaklass Profession - ett yrke.

Anteckningar

  1. Tcl Advocacy . Hämtad 2 december 2009. Arkiverad från originalet 22 september 2010.
  2. David M. Beazley. Python Essential Reference . — 4:e upplagan. - Addison-Wesley Professional, 2009. - S.  119 -122. — 717 sid. — ISBN 978-0672329784 .
  3. Tcl Manual: klass . Hämtad 2 december 2009. Arkiverad från originalet 4 april 2009.
  4. Egenskaper: Sammansättbara enheter av beteende . Hämtad 2 december 2009. Arkiverad från originalet 9 augusti 2017.

Länkar

Litteratur