Arv och Polymorfi
Förord
C++ är ett av de mest använda programmeringsspråken inom objektorienterad design. För att ett programmeringsspråk ska få kallas objektorienterat krävs det att fyra viktiga punkter uppfylls. Dessa punkter är, arv, polymorfism, inkapsling samt abstraktion. Det är polymorfism som skall tas upp och redas ut i denna artikel. Ordet polymorfism betyder mångformighet, det vill säga att t.ex. en metod med ett speciellt metodnamn kan finnas två eller flera gånger och vilken som ska köras bestäms först under programkörningstiden (runtime), men det finns även överlagrade funktioner som är polymorfa och bestäms under kompileringstiden (compile-time). Polymorfism sägs ge några fördelar så som större möjlighet att kunna utöka och återanvända kod från programmet. Undersökningen sker med hjälp av internetsökningar och litteraturstudier om det har sådana fördelar som det sägs och har avgränsas till frågeställningen ”Vad är det som gör polymorfism så användbart?”.Innehåll
»»
»
»
»
»
»
»
»
»
»
»
Teoretisk Bakgrund
Gamla språk som inte är objektorienterade såsom Pascal till exempel som måste ha ett attribut eller en funktion som en unik typ kallas ”monomorphic”. Man kan sätta de monomorfa språken i kontrast med de polymorfa språken där en metod kan ha fler än ett värde och samma namn på olika metoder. Detta kallas överlagring. Enligt Cardelli[2] delas polymorfism upp i två stycken huvudkategorier. Dessa två kategorier är ad-hoc och universal. Men även dessa två kategorier delas upp i flera underkategorier. Universal består av parametric och inclussion, ad-hoc består av overloading och coercion. Rogers[3] ger en överskådlig blick över dessa indelningar ungefär såhär.
Coercion
Coercion som betyder tvång representerar implicit parameter typkonvertering till den typen som förväntas ta emot av en metod eller en operator, för att undvika fel. För följande uttryck måste kompilatorn avgöra huruvida en lämplig binär +operator existerar för dessa operationer. Rogers[3] ger följande exempel.
2.0 + 2.0
2.0 + 2
2.0 + "2"
Det första uttrycket adderar två stycken flyttal. Javaspråket har en sådan operatorfunktion i sig och klarar av den utan problem, däremot den andra som adderar ett heltal och ett flyttal finns det ingen färdig operatorfunktion för. Då gör kompilatorn en implicit typkonvertering av heltalet till ett flyttal och kan då addera dessa två tal utan vidare. Utan denna implicita typkonvertering skulle det uppstå ett compile-time error vilket skulle resultera i att programmeraren själv skulle få lov att explicit göra en typkonvertering till ett flyttal. Det tredje uttrycket adderar ett flyttal med en sträng. Javakompilatorn har inte en sådan färdig operatorfunktion heller utan gör en implicit typkonvertering av flyttalet till en sträng och plusoperatorn utför en konkatenation på strängen.
Overloading
Rogers[3] skriver även att överlagring tillåter användandet av samma operator eller metodnamn att ha flera olika betydelser. +operatorn i exemplet på coercion användes på två olika sätt. De första två användes för att addera två stycken flyttal, men den tredje användes för att konkatinera strängar. Eftersom samma anrop användes så kallas det alltså överlagring, och kompilatorn ska se till så att rätt metod väljs. Både coercion och overloading hittas under ad-hoc eftersom båda två tillhandahåller polymorfiskt beteende bara under en begränsad mening. Coercion undviker ohanterlig explicita typkonverteringar eller onödiga kompileringsfel. Overloading däremot är snällare, vilket tillåter utvecklaren att använda samma namn för distinkta metoder.
Parametric
Parametrisk polymorfism tillåter användandet av enkel abstraktion mellan många typer. T.ex. en List abstraktion som representerar en lista med homogena objekt, kan vara förutsatt att vara en allmän modul. Då skulle det gå att återanvända abstraktionen genom att specificera vilken typ av objekt som finns i listan. Eftersom den paramatiserade typen kan vara vilken användardefinierad datatyp som helst. Potentiellt finns det oändligt många olika sätt att använda en sådan allmän abstraktion, därför kan detta sätt av polymorfism ses som den bästa.
Inclusion
Inclusion polymorfism uppnår polymorfiskt beteende genom en inkluderingsrelation mellan typer eller värden. I många objektorienterade programmeringsspråk, inklusive Java, är inkluderingsrelationen en ”undertypsrelation”. Så i Java är inclusion polymorfism en undertypspolymorfism.
Arv
I C++ uppnås dynamisk polymorfism vid arv och virtuella funktioner 7. Arv specificerar inte bara vad som kommer att återanvändas utan också släktskapet mellan basklassen och den ärvda klassen. Det är släktskapen som gör det säkert att behandla objekt från den ärvda klassen som objekt utav basklassen, därför kan man säga att arv är polymorfistiskt. Nya ärvda klasser kan definieras och lätt passa in som en del av systemet. I C++ använder man sig av ordet ”virtual” vid arv. Med ordet virtual kan man välja vilken säkerhetsprincip som ska gälla vid arv. Programmeraren kan också välja att inte skriva virtual vid en funktion, på så sätt kommer den funktionen inte vara tillåten att anropa i den klassen som har ärvt. Detta är något som är specifikt för C++ och inte finns i java. Där ärvs alla metoder när man ärver en klass.
Fördel
Polymorfism anses vara en stor fördel som finns i objektorienterade programmeringsspråk. Den ger
mjukvaran ett allmänt interface definierat av en basklass så att objekt kan bli manipulerade fast det är en instans av antingen basklassen eller en annan ärvd klass.
Metod
För att kunna lösa den ställda problemformuleringen följer här nedan de tekniker och metoder som har valts att användas. För att läsaren ska kunna göra en rättvis bedömning utav arbetet är det viktigt att dessa anges. Även att välja rätt metoder är viktigt för att över huvud taget lösa de ställda problemen. De metoder som kommer att användas är Internetsökningar Litteraturstudier
Internetsökningar
Eftersom c++ har funnits sedan 1980-talet finns det en del vetenskapliga artiklar om programmeringsspråket och just polymorfism som jag valt att skriva om. Även Java som är ett objektorienterat språk har funnits ett tag och det finns även en del artiklar om det. Jag har mestadels använt mig av databassökning där ”ACM portal” gett många träffar.
Litteraturstudier
Det finns även en del böcker som beskriver polymorfism. De böcker som har använts är bland annat ”C++ Programming with designpatterns revealed” av Tomasz Müldner som är kurslitteratur till kursen. Men även en del andra böcker har använts.
Slutsatser
Polymorfism är en stor fördel inom det objektorienterade språket. Det gör programmen lättare att modifiera samt lätt att återanvända. Det finns två olika huvudkategorier inom polymorfismen.Dessa är ad-hoc och universal. Ad-hoc består utav coercion och overloading vilket inte är någon ren polymorfism som parametric och inclussion som finns under unviversal är, men de upplevs som polymorfa av programmeraren ändå. Vid arv i C++ används ordet virtual för att ange åtkomsten på de metoderna som ärvs. Vill man så kan man alltså utelämna ordet virtual och med det menas då att de metoderna som saknar ordet virtual inte går att anropa från en klass som ärver metoder från en annan klass. Detta är dock något som är specifikt för C++ och återfinns ej i Java. Det som gör polymorfismen så användbar är alltså att det blir betydligt mycket enklare att skriva större och förståeligare program då man kan använda sig av arv för att återanvända kod. Arv används när man kan säga ”består av” eller ”är en”, t.ex. ”student är en person”. Då ärver alltså student utav person och tack vare det kan man spara in väldigt många rader med kod.
Referenser
[1] Tomasz Müldner, “C++
Programming with design Patterns
Revealed”, Addison
Wesley, 2002
[2] Luca Cardelli, Peter Wegner,
On Understanding Types, Data
Abstraction, and Polymorphism (1985)
http://citeseer.nj.nec.com/cs
2004-12-07
[3] Paul Rogers, Reveal the magic
behind subtype polymorphism - Behold
polymorphism from a type-oriented
point of view (2001)
http://www.javaworld.com
2004-12-07
[4] Saïda Benlarbi, Walcelio L. Melo,
Polymorphism Measuers for Early
Risk Prediction (1999)
http://portal.acm.org
2004-12-07
[5] Jan Skansholm, “Java Direkt”,
Studentlitteratur, 2002
[6] J. Meseguer, Relating Models of
Polymorphism* (1989)
http://portal.acm.org
2004-12-07
[7] Wen-Ke Chen, Jia-Su Sun, Zhi-
Min Tang, Consumating Virtuality to
support More Polymorphism in C++
(1997)
http://portal.acm.org
2004-12-08
Pelle Johansson
Tack för ditt bidrag. Hoppas du har intresse att skriva fler! Denna uppmärksammades även i senaste utgåvan av nyhetsbrevet Hack!