Metodetilsidesættelse i objektorienteret programmering er en af funktionerne i et programmeringssprog, der tillader en underklasse eller underklasse at give en specifik implementering af en metode, der allerede er implementeret i en af superklasserne eller overordnede klasser. Implementeringen af en metode i en underklasse tilsidesætter (erstatter) dens implementering i superklassen og beskriver en metode med samme navn som superklassemetoden, og den nye underklassemetode skal have samme parametre eller signatur, returtype som den overordnede klassemetode [1] . Den version af metoden, der vil blive udført, bestemmes af det objekt , der bruges til at kalde den. Hvis metoden kaldes fra et objekt af den overordnede klasse, så udføres versionen af den overordnede klasses metode, hvis objektet i underklassen kalder metoden, så udføres versionen af den underordnede klasse [2] . Nogle programmeringssprog giver programmøren mulighed for at beskytte metoder mod at blive tilsidesat.
I programmeringssproget Java , når en underklasse indeholder en metode, der tilsidesætter en superklassemetode, kan den kalde superklassemetoden ud over sin egen metode ved hjælp af nøgleordet super [2] . Eksempel:
public class Thought { public void message () { System . ud . println ( "Jeg føler mig som en guldsmede i et parallelt univers." ); } } public class Advice extends Thought { @Override // Java 5 @Override-annotationen er valgfri, men meget nyttig public void message () { System . ud . println ( "Advarsel: Kalenderdatoer er tættere på, end de ser ud til!" ); } }Klassen Thoughter en superklasse og giver et metodekald message(). Underklassen, kaldet Advice, arver hver metode i klassen Thought. Klassen Advicetilsidesætter dog metoden message()og tilsidesætter funktionaliteten beskrevet i klassen Thought.
Tænkte t1 = null ; t1 = ny tanke (); t1 . besked (); // Udskrifter "Jeg føler mig som en guldsmede i et parallelt univers." t1 = newAdvice ( ); // Polymorfi t1 . besked (); // Udskriver "Advarsel: Kalenderdatoer er tættere på, end de ser ud."Ordet superbruges til at kalde superklasseversionen af metoden fra underklassen. For eksempel udsender følgende begge meddelelser, når en underklassemetode kaldes:
public class Advice extends Thought { @Override public void message () { System . ud . println ( "Advarsel: Kalenderdatoer er tættere på, end de ser ud." ); super . besked (); // Kald den overordnede klasseversion af metoden } }Det er ikke muligt for en klasse, der er erklæret finalat blive en superklasse [3] .
C++-sproget mangler nøgleordet super, som underklasser i Java bruger til at kalde superklasseversionen af en metode i stedet for den tilsidesatte. I stedet bruges omfangsoperatoren før det overordnede eller basisklassenavn . For eksempel fungerer følgende kode på to klasser : en basisklasse Rectangleog en afledt klasse Box. Boxvil tilsidesætte print()klassemetoden , Rectangleså den udskriver dens højde. [fire]
klasse rektangel { public : virtual void print () const ; privat : dobbelt længde ; dobbelt- bredde ; }; void Rectangle::print () // basisklasse print() metode { cout << "Længde = " << længde << "; Bredde = " << bredde ; } klasse Box : offentlig rektangel { offentligt : void print () const ; privat : dobbelt højde ; }; void Box::print () // afledt klasse print() metode { Rektangel :: print (); // kalder den overordnede metode print() cout << "; Height= " << height ; }En metode print()i en klasse Boxkaldes af den overordnede version af metoden print(), som også er i stand til at udlede værdien af private variabler length og widthbasisklassen. I andre tilfælde er disse variabler ikke tilgængelige for Box.
Følgende udsagn opretter objekter af typen Rectangleog Boxkalder deres metoder i overensstemmelse hermed print():
Rektangel myRektangel ( 5.0 , 3.0 ); mitRektangel . print (); // output: // Længde = 5,0; Bredde = 3,0 Box myBox ( 6.0 , 5.0 , 4.0 ); minBox . print (); // output: // Længde = 6,0; bredde=5,0; Højde = 4,0