Metodöverstyrning i objektorienterad programmering är en av funktionerna i ett programmeringsspråk som tillåter en underklass eller barnklass att tillhandahålla en specifik implementering av en metod som redan är implementerad i en av superklasserna eller överordnade klasserna. Implementeringen av en metod i en underklass åsidosätter (ersätter) dess implementering i superklassen, och beskriver en metod med samma namn som superklassmetoden, och den nya underklassmetoden måste ha samma parametrar eller signatur, returtyp som den överordnade klassmetoden [ett]. Den version av metoden som kommer att exekveras av objektet som används för att anropa den. Om metoden anropas från ett objekt av den överordnade klassen, så exekveras versionen av den överordnade klassens metod, om objektet i underklassen anropar metoden, så exekveras versionen av den underordnade klassen [2] . Vissa programmeringsspråk tillåter programmeraren att skydda metoder från att åsidosättas.
I programmeringsspråket Java , när en underklass innehåller en metod som åsidosätter en superklassmetod, kan den anropa superklassmetoden förutom sin egen metod med hjälp av nyckelordet super [2] . Exempel:
public class Thought { public void message () { System . ut . println ( "Jag känner mig som en trollslända i ett parallellt universum." ); } } public class Advice extends Thought { @Override // Java 5 @Override-kommentaren är valfri men mycket användbar public void message () { System . ut . println ( "Varning: Kalenderdatum är närmare än de verkar!" ); } }Klassen Thoughtär en superklass och tillhandahåller ett metodanrop message(). Underklassen, kallad Advice, ärver varje metod i klassen Thought. Klassen Adviceåsidosätter dock metoden message()och åsidosätter den funktionalitet som beskrivs i klassen Thought.
Tänkte t1 = null ; t1 = ny tanke (); t1 . meddelande (); // Prints "Jag känner mig som en trollslända i ett parallellt universum." t1 = newAdvice ( ); // Polymorfism t1 . meddelande (); // Skriver ut "Varning: Kalenderdatum är närmare än de ser ut."Ordet superanvänds för att anropa superklassversionen av metoden från underklassen. Till exempel matar följande ut båda meddelandena när en underklassmetod anropas:
public class Advice extends Thought { @Override public void message () { System . ut . println ( "Varning: Kalenderdatum är närmare än de ser ut." ); super . meddelande (); // Anropa den överordnade klassversionen av metoden } }Det är inte möjligt för en klass som deklareras som finalen superklass [3] .
Språket C++ saknar nyckelordet supersom underklasser i Java använder för att anropa superklassversionen av en metod istället för den åsidosatta. Omfattningsoperatorn används istället före det överordnade eller basklassnamnet . Till exempel fungerar följande kod på två klasser : en basklass Rectangleoch en härledd klass Box. Boxkommer att åsidosätta print()klassmetoden Rectangleså att den skriver ut sin höjd. [fyra]
klass rektangel { public : virtual void print () const ; privat : dubbel längd ; dubbel bredd ; }; void Rectangle::print () // basklass print() method { cout << "Längd = " << längd << "; Width = " << bredd ; } klass Box : offentlig rektangel { offentliga : void print () const ; privat : dubbel höjd ; }; void Box::print () // härledd klass print() method { Rektangel :: print (); // anropar föräldrametoden print() cout << "; Height= " << height ; }En metod print()i en klass Boxanropas av den överordnade versionen av metoden print(), som också kan härleda värdet av privata variabler length och widthbasklassen. I andra fall är dessa variabler inte tillgängliga för Box.
Följande satser skapar objekt av typen Rectangleoch Boxanropar deras metoder i enlighet med detta print():
Rectangle myRectangle ( 5.0 , 3.0 ); min rektangel . print (); // utgångar: // Längd = 5,0; Bredd = 3,0 Box myBox ( 6.0 , 5.0 , 4.0 ); myBox . print (); // utgångar: // Längd = 6,0; bredd=5,0; Höjd = 4,0