Vad är metodöverskridande?

Metodöverstyrning används i objektorienterad programmering inom en arvshierarki, och det inträffar när en metod definierad i en superklass omdefinieras i en underklass. Vanligtvis gör subklassmetoden något annat än superklassmetoden eller expanderar på en förmåga hos superklassen, men detta behöver inte vara fallet. Metodåsidosättning inträffar närhelst en superklassmetod omdefinieras i en underklass, oavsett innehållet i den omdefinierade metoden. De omdefinierade metodsignaturerna måste vara exakt desamma.

Till exempel kan en klass A innehålla en metod som heter ”doSomething”, och denna metod tar inga indataparametrar. Dessutom kan klasserna B och C vara underklasser av klass A. Klass B kan innehålla en metod som kallas ”doSomething”, som inte tar några indataparametrar, och klass C kan innehålla en metod ”doSomething” som tar ett nummer som en indataparameter. I det här exemplet skulle endast klass B visa metodöverstyrning, eftersom dess ”doSomething”-metod har samma metodsignatur som dess superklass, klass A. ”doSomething”-metoden i klass C, å andra sidan, visar metodöverbelastning eftersom den skapar en helt ny metod.

Virtuellt arv i C++ är ett annat exempel på metodöverstyrning. Virtuella metoder i superklasser kan eller kanske inte implementeras, men varje underklassdefinition av dem är en instans av metodöverstyrning. När en metod åsidosätts i en underklass, anropas inte metoden för superklassen om den inte anropas uttryckligen. Detta specifika sätt att anropa en åsidosatt metod sägs ofta ”dölja” superklassimplementeringen.

Även om metodöverstyrning är mycket flexibel, kan inte alla metoder åsidosättas, och det finns tillfällen då denna stelhet kan vara att föredra. I både Java och C++ kan specifika nyckelord användas i metodsignaturer för att förhindra att en metod åsidosätts i en underklass. För att göra detta använder Java nyckelordet ”slutlig” och C++ använder nyckelordet ”const”. Att förhindra metodöverstyrning kan vara fördelaktigt om en viss funktion alltid ska vara oförändrad genom hela ett arvsträd.

Generellt sett ska enkla metoder som får små bitar av data inte behöva åsidosättas. Fall som tenderar att dra mest nytta av att åsidosätta är när en underklass syftar till att lägga till funktionalitet till en superklassmetod utan att skapa en helt ny metod för att göra det. Ovanliga fall där en metod måste göras om helt för en specifik typ av objekt kan också dra nytta av denna teknik. Närhelst en metod åsidosätts är det viktigt för programmeraren att korrekt kommentera både superklass- och underklassmetoderna. Helst bör dessa kommentarer klargöra vad varje variant av metoden gör, samt hur och varför de skiljer sig åt.