Method overriding
Language feature in object-oriented programming
- 19 min read
- 1 chapter
Related on Lably
Through Object-oriented programming, Inheritance (object-oriented programming) and Method (computer programming)
Language-specific examples
Ada
Ada provides method overriding by default. To favor early error detection (e.g. a misspelling), it is possible to specify when a method is expected to be actually overriding, or not. That will be checked by the compiler.
<span id="mwMQ"></span> <span class="kd" id="mwMg">type</span> <span class="kt" id="mwMw">T</span> <span class="kr" id="mwNA">is</span> <span class="kr" id="mwNQ">new</span> <span class="kt" id="mwNg">Controlled</span> <span class="kr" id="mwNw">with</span> <span class="p" id="mwOA">......;</span> <span class="kd" id="mwOQ">procedure</span> <span class="nf" id="mwOg">Op</span><span class="p" id="mwOw">(</span><span class="nv" id="mwPA">Obj</span><span class="p" id="mwPQ">: </span><span class="nv" id="mwPg">in</span> <span class="nv" id="mwPw">out</span> <span class="nv" id="mwQA">T</span><span class="p" id="mwQQ">;</span> <span class="nv" id="mwQg">Data</span><span class="p" id="mwQw">: </span><span class="nv" id="mwRA">in</span> <span class="nv" id="mwRQ">Integer</span><span class="p" id="mwRg">);</span> <span class="kd" id="mwRw">type</span> <span class="kt" id="mwSA">NT</span> <span class="kr" id="mwSQ">is</span> <span class="kr" id="mwSg">new</span> <span class="n" id="mwSw">T</span> <span class="kr" id="mwTA">with</span> <span class="kr" id="mwTQ">null record</span><span class="p" id="mwTg">;</span> <span class="kr" id="mwTw">overriding</span> <span class="c1" id="mwUA">-- overriding indicator</span> <span class="kd" id="mwUQ">procedure</span> <span class="nf" id="mwUg">Op</span><span class="p" id="mwUw">(</span><span class="nv" id="mwVA">Obj</span><span class="p" id="mwVQ">: </span><span class="nv" id="mwVg">in</span> <span class="nv" id="mwVw">out</span> <span class="nv" id="mwWA">NT</span><span class="p" id="mwWQ">;</span> <span class="nv" id="mwWg">Data</span><span class="p" id="mwWw">: </span><span class="nv" id="mwXA">in</span> <span class="nv" id="mwXQ">Integer</span><span class="p" id="mwXg">);</span> <span class="kr" id="mwXw">overriding</span> <span class="c1" id="mwYA">-- overriding indicator</span> <span class="kd" id="mwYQ">procedure</span> <span class="nf" id="mwYg">Op</span><span class="p" id="mwYw">(</span><span class="nv" id="mwZA">Obj</span><span class="p" id="mwZQ">: </span><span class="nv" id="mwZg">in</span> <span class="nv" id="mwZw">out</span> <span class="nv" id="mwaA">NT</span><span class="p" id="mwaQ">;</span> <span class="nv" id="mwag">Data</span><span class="p" id="mwaw">: </span><span class="nv" id="mwbA">in</span> <span class="nv" id="mwbQ">String</span><span class="p" id="mwbg">);</span> <span class="c1" id="mwbw">-- ^ compiler issues an error: subprogram "Op" is not overriding</span>
C#
C# does support method overriding, but only if explicitly requested using the modifiers override and virtual or abstract.
<span id="mwgg"></span><span class="k" id="mwgw">abstract</span><span class="w" id="mwhA"> </span><span class="k" id="mwhQ">class</span><span class="w" id="mwhg"> </span><span class="nc" id="mwhw">Animal</span> <span class="p" id="mwiA">{</span> <span class="w" id="mwiQ"> </span><span class="k" id="mwig">public</span><span class="w" id="mwiw"> </span><span class="kt" id="mwjA">string</span><span class="w" id="mwjQ"> </span><span class="n" id="mwjg">Name</span><span class="w" id="mwjw"> </span><span class="p" id="mwkA">{</span><span class="w" id="mwkQ"> </span><span class="k" id="mwkg">get</span><span class="p" id="mwkw">;</span><span class="w" id="mwlA"> </span><span class="k" id="mwlQ">set</span><span class="p" id="mwlg">;</span><span class="w" id="mwlw"> </span><span class="p" id="mwmA">}</span> <span class="w" id="mwmQ"> </span><span class="c1" id="mwmg">// Methods</span> <span class="w" id="mwmw"> </span><span class="k" id="mwnA">public</span><span class="w" id="mwnQ"> </span><span class="k" id="mwng">void</span><span class="w" id="mwnw"> </span><span class="nf" id="mwoA">Drink</span><span class="p" id="mwoQ">();</span> <span class="w" id="mwog"> </span><span class="k" id="mwow">public</span><span class="w" id="mwpA"> </span><span class="k" id="mwpQ">virtual</span><span class="w" id="mwpg"> </span><span class="k" id="mwpw">void</span><span class="w" id="mwqA"> </span><span class="nf" id="mwqQ">Eat</span><span class="p" id="mwqg">();</span> <span class="w" id="mwqw"> </span><span class="k" id="mwrA">public</span><span class="w" id="mwrQ"> </span><span class="k" id="mwrg">void</span><span class="w" id="mwrw"> </span><span class="nf" id="mwsA">Move</span><span class="p" id="mwsQ">();</span> <span class="p" id="mwsg">}</span> <span class="k" id="mwsw">class</span><span class="w" id="mwtA"> </span><span class="nc" id="mwtQ">Cat</span><span class="w" id="mwtg"> </span><span class="p" id="mwtw">:</span><span class="w" id="mwuA"> </span><span class="n" id="mwuQ">Animal</span> <span class="p" id="mwug">{</span> <span class="w" id="mwuw"> </span><span class="k" id="mwvA">public</span><span class="w" id="mwvQ"> </span><span class="k" id="mwvg">new</span><span class="w" id="mwvw"> </span><span class="kt" id="mwwA">string</span><span class="w" id="mwwQ"> </span><span class="n" id="mwwg">Name</span><span class="w" id="mwww"> </span><span class="p" id="mwxA">{</span><span class="w" id="mwxQ"> </span><span class="k" id="mwxg">get</span><span class="p" id="mwxw">;</span><span class="w" id="mwyA"> </span><span class="k" id="mwyQ">set</span><span class="p" id="mwyg">;</span><span class="w" id="mwyw"> </span><span class="p" id="mwzA">}</span> <span class="w" id="mwzQ"> </span><span class="c1" id="mwzg">// Methods</span> <span class="w" id="mwzw"> </span><span class="k" id="mw0A">public</span><span class="w" id="mw0Q"> </span><span class="k" id="mw0g">void</span><span class="w" id="mw0w"> </span><span class="nf" id="mw1A">Drink</span><span class="p" id="mw1Q">();</span><span class="w" id="mw1g"> </span><span class="c1" id="mw1w">// Warning: hides inherited Drink(). Use new</span> <span class="w" id="mw2A"> </span><span class="k" id="mw2Q">public</span><span class="w" id="mw2g"> </span><span class="k" id="mw2w">override</span><span class="w" id="mw3A"> </span><span class="k" id="mw3Q">void</span><span class="w" id="mw3g"> </span><span class="nf" id="mw3w">Eat</span><span class="p" id="mw4A">();</span><span class="w" id="mw4Q"> </span><span class="c1" id="mw4g">// Overrides inherited Eat().</span> <span class="w" id="mw4w"> </span><span class="k" id="mw5A">public</span><span class="w" id="mw5Q"> </span><span class="k" id="mw5g">new</span><span class="w" id="mw5w"> </span><span class="k" id="mw6A">void</span><span class="w" id="mw6Q"> </span><span class="nf" id="mw6g">Move</span><span class="p" id="mw6w">();</span><span class="w" id="mw7A"> </span><span class="c1" id="mw7Q">// Hides inherited Move().</span> <span class="p" id="mw7g">}</span>When overriding one method with another, the signatures of the two methods must be identical (and with same visibility). In C#, class methods, indexers, properties and events can all be overridden.
Non-virtual or static methods cannot be overridden. The overridden base method must be virtual, abstract, or override.
In addition to the modifiers that are used for method overriding, C# allows the hiding of an inherited property or method. This is done using the same signature of a property or method but adding the modifier new in front of it.
In the above example, hiding causes the following:
<span id="mwAQQ"></span><span class="n" id="mwAQU">Cat</span><span class="w" id="mwAQY"> </span><span class="n" id="mwAQc">cat</span><span class="w" id="mwAQg"> </span><span class="o" id="mwAQk">=</span><span class="w" id="mwAQo"> </span><span class="k" id="mwAQs">new</span><span class="w" id="mwAQw"> </span><span class="n" id="mwAQ0">Cat</span><span class="p" id="mwAQ4">();</span> <span class="n" id="mwAQ8">cat</span><span class="p" id="mwARA">.</span><span class="n" id="mwARE">Name</span><span class="w" id="mwARI"> </span><span class="o" id="mwARM">=</span><span class="w" id="mwARQ"> </span><span class="s" id="mwARU">"Mittens"</span><span class="p" id="mwARY">;</span><span class="w" id="mwARc"> </span><span class="c1" id="mwARg">// accesses Cat.Name</span> <span class="n" id="mwARk">cat</span><span class="p" id="mwARo">.</span><span class="n" id="mwARs">Eat</span><span class="p" id="mwARw">();</span><span class="w" id="mwAR0"> </span><span class="c1" id="mwAR4">// calls Cat.Eat()</span> <span class="n" id="mwAR8">cat</span><span class="p" id="mwASA">.</span><span class="n" id="mwASE">Move</span><span class="p" id="mwASI">();</span><span class="w" id="mwASM"> </span><span class="c1" id="mwASQ">// calls Cat.Move()</span> <span class="p" id="mwASU">((</span><span class="n" id="mwASY">Animal</span><span class="p" id="mwASc">)</span><span class="n" id="mwASg">cat</span><span class="p" id="mwASk">).</span><span class="n" id="mwASo">Name</span><span class="w" id="mwASs"> </span><span class="o" id="mwASw">=</span><span class="w" id="mwAS0"> </span><span class="s" id="mwAS4">"Fluffy"</span><span class="p" id="mwAS8">;</span><span class="w" id="mwATA"> </span><span class="c1" id="mwATE">// accesses Animal.Name</span> <span class="p" id="mwATI">((</span><span class="n" id="mwATM">Animal</span><span class="p" id="mwATQ">)</span><span class="n" id="mwATU">cat</span><span class="p" id="mwATY">).</span><span class="n" id="mwATc">Eat</span><span class="p" id="mwATg">();</span><span class="w" id="mwATk"> </span><span class="c1" id="mwATo">// calls Cat.Eat()</span> <span class="p" id="mwATs">((</span><span class="n" id="mwATw">Animal</span><span class="p" id="mwAT0">)</span><span class="n" id="mwAT4">cat</span><span class="p" id="mwAT8">).</span><span class="n" id="mwAUA">Move</span><span class="p" id="mwAUE">();</span><span class="w" id="mwAUI"> </span><span class="c1" id="mwAUM">// calls Animal.Move()</span>
C++
C++ does not have the keyword super like Java that can be used in a subclass method to access the superclass version of a method to override. Instead, the name of the parent or base class is used followed by the scope resolution operator. For example, the following code presents two classes, the base class Rectangle, and the derived class Box. Box overrides the Rectangle class's display method, so as also to print its height.
<span id="mwAVc"></span><span class="k" id="mwAVg">import</span><span class="w" id="mwAVk"> </span><span class="n" id="mwAVo">std</span><span class="p" id="mwAVs">;</span> <span class="k" id="mwAVw">class</span><span class="w" id="mwAV0"> </span><span class="nc" id="mwAV4">Rectangle</span><span class="w" id="mwAV8"> </span><span class="p" id="mwAWA">{</span> <span class="k" id="mwAWE">private</span><span class="o" id="mwAWI">:</span> <span class="w" id="mwAWM"> </span><span class="kt" id="mwAWQ">double</span><span class="w" id="mwAWU"> </span><span class="n" id="mwAWY">length</span><span class="p" id="mwAWc">;</span> <span class="w" id="mwAWg"> </span><span class="kt" id="mwAWk">double</span><span class="w" id="mwAWo"> </span><span class="n" id="mwAWs">width</span><span class="p" id="mwAWw">;</span> <span class="k" id="mwAW0">public</span><span class="o" id="mwAW4">:</span> <span class="w" id="mwAW8"> </span><span class="n" id="mwAXA">Rectangle</span><span class="p" id="mwAXE">(</span><span class="kt" id="mwAXI">double</span><span class="w" id="mwAXM"> </span><span class="n" id="mwAXQ">length</span><span class="p" id="mwAXU">,</span><span class="w" id="mwAXY"> </span><span class="kt" id="mwAXc">double</span><span class="w" id="mwAXg"> </span><span class="n" id="mwAXk">width</span><span class="p" id="mwAXo">)</span><span class="o" id="mwAXs">:</span><span class="w" id="mwAXw"> </span> <span class="w" id="mwAX0"> </span><span class="n" id="mwAX4">length</span><span class="p" id="mwAX8">{</span><span class="n" id="mwAYA">length</span><span class="p" id="mwAYE">},</span><span class="w" id="mwAYI"> </span><span class="n" id="mwAYM">width</span><span class="p" id="mwAYQ">{</span><span class="n" id="mwAYU">width</span><span class="p" id="mwAYY">}</span><span class="w" id="mwAYc"> </span><span class="p" id="mwAYg">{}</span> <span class="w" id="mwAYk"> </span><span class="k" id="mwAYo">virtual</span><span class="w" id="mwAYs"> </span><span class="kt" id="mwAYw">void</span><span class="w" id="mwAY0"> </span><span class="n" id="mwAY4">display</span><span class="p" id="mwAY8">()</span><span class="w" id="mwAZA"> </span><span class="k" id="mwAZE">const</span><span class="w" id="mwAZI"> </span><span class="p" id="mwAZM">{</span> <span class="w" id="mwAZQ"> </span><span class="n" id="mwAZU">std</span><span class="o" id="mwAZY">::</span><span class="n" id="mwAZc">println</span><span class="p" id="mwAZg">(</span><span class="s" id="mwAZk">"Rectangle[length={}, width={}]"</span><span class="p" id="mwAZo">,</span><span class="w" id="mwAZs"> </span><span class="n" id="mwAZw">length</span><span class="p" id="mwAZ0">,</span><span class="w" id="mwAZ4"> </span><span class="n" id="mwAZ8">width</span><span class="p" id="mwAaA">);</span> <span class="w" id="mwAaE"> </span><span class="p" id="mwAaI">}</span> <span class="p" id="mwAaM">};</span> <span class="k" id="mwAaQ">class</span><span class="w" id="mwAaU"> </span><span class="nc" id="mwAaY">Box</span><span class="o" id="mwAac">:</span><span class="w" id="mwAag"> </span><span class="k" id="mwAak">public</span><span class="w" id="mwAao"> </span><span class="n" id="mwAas">Rectangle</span><span class="w" id="mwAaw"> </span><span class="p" id="mwAa0">{</span> <span class="k" id="mwAa4">private</span><span class="o" id="mwAa8">:</span> <span class="w" id="mwAbA"> </span><span class="kt" id="mwAbE">double</span><span class="w" id="mwAbI"> </span><span class="n" id="mwAbM">height</span><span class="p" id="mwAbQ">;</span> <span class="k" id="mwAbU">public</span><span class="o" id="mwAbY">:</span> <span class="w" id="mwAbc"> </span><span class="n" id="mwAbg">Box</span><span class="p" id="mwAbk">(</span><span class="kt" id="mwAbo">double</span><span class="w" id="mwAbs"> </span><span class="n" id="mwAbw">length</span><span class="p" id="mwAb0">,</span><span class="w" id="mwAb4"> </span><span class="kt" id="mwAb8">double</span><span class="w" id="mwAcA"> </span><span class="n" id="mwAcE">width</span><span class="p" id="mwAcI">,</span><span class="w" id="mwAcM"> </span><span class="kt" id="mwAcQ">double</span><span class="w" id="mwAcU"> </span><span class="n" id="mwAcY">height</span><span class="p" id="mwAcc">)</span><span class="o" id="mwAcg">:</span><span class="w" id="mwAck"> </span> <span class="w" id="mwAco"> </span><span class="n" id="mwAcs">Rectangle</span><span class="p" id="mwAcw">(</span><span class="n" id="mwAc0">length</span><span class="p" id="mwAc4">,</span><span class="w" id="mwAc8"> </span><span class="n" id="mwAdA">width</span><span class="p" id="mwAdE">),</span><span class="w" id="mwAdI"> </span><span class="n" id="mwAdM">height</span><span class="p" id="mwAdQ">{</span><span class="n" id="mwAdU">height</span><span class="p" id="mwAdY">}</span><span class="w" id="mwAdc"> </span><span class="p" id="mwAdg">{}</span> <span class="w" id="mwAdk"> </span><span class="kt" id="mwAdo">void</span><span class="w" id="mwAds"> </span><span class="n" id="mwAdw">display</span><span class="p" id="mwAd0">()</span><span class="w" id="mwAd4"> </span><span class="k" id="mwAd8">const</span><span class="w" id="mwAeA"> </span><span class="k" id="mwAeE">override</span><span class="w" id="mwAeI"> </span><span class="p" id="mwAeM">{</span> <span class="w" id="mwAeQ"> </span><span class="c1" id="mwAeU">// Invoke parent display() method.</span> <span class="w" id="mwAeY"> </span><span class="n" id="mwAec">Rectangle</span><span class="o" id="mwAeg">::</span><span class="n" id="mwAek">display</span><span class="p" id="mwAeo">();</span> <span class="w" id="mwAes"> </span><span class="n" id="mwAew">std</span><span class="o" id="mwAe0">::</span><span class="n" id="mwAe4">println</span><span class="p" id="mwAe8">(</span><span class="s" id="mwAfA">"Box[length={}, width={}, height={}]"</span><span class="p" id="mwAfE">,</span><span class="w" id="mwAfI"> </span><span class="n" id="mwAfM">length</span><span class="p" id="mwAfQ">,</span><span class="w" id="mwAfU"> </span><span class="n" id="mwAfY">width</span><span class="p" id="mwAfc">,</span><span class="w" id="mwAfg"> </span><span class="n" id="mwAfk">height</span><span class="p" id="mwAfo">);</span> <span class="w" id="mwAfs"> </span><span class="p" id="mwAfw">}</span> <span class="p" id="mwAf0">};</span>The method display in class Box, by invoking the parent version of method display, is also able to output the private variables length and width of the base class. Otherwise, these variables are inaccessible to Box.
The following statements will instantiate objects of type Rectangle and Box, and call their respective display methods:
<span id="mwAg4"></span><span class="kt" id="mwAg8">int</span><span class="w" id="mwAhA"> </span><span class="nf" id="mwAhE">main</span><span class="p" id="mwAhI">(</span><span class="kt" id="mwAhM">int</span><span class="w" id="mwAhQ"> </span><span class="n" id="mwAhU">argc</span><span class="p" id="mwAhY">,</span><span class="w" id="mwAhc"> </span><span class="kt" id="mwAhg">char</span><span class="o" id="mwAhk">*</span><span class="w" id="mwAho"> </span><span class="n" id="mwAhs">argv</span><span class="p" id="mwAhw">[])</span><span class="w" id="mwAh0"> </span><span class="p" id="mwAh4">{</span> <span class="w" id="mwAh8"> </span><span class="n" id="mwAiA">Rectangle</span><span class="w" id="mwAiE"> </span><span class="n" id="mwAiI">rectangle</span><span class="p" id="mwAiM">(</span><span class="mf" id="mwAiQ">5.0</span><span class="p" id="mwAiU">,</span><span class="w" id="mwAiY"> </span><span class="mf" id="mwAic">3.0</span><span class="p" id="mwAig">);</span> <span class="w" id="mwAik"> </span> <span class="w" id="mwAio"> </span><span class="c1" id="mwAis">// Outputs: Rectangle[length=5.0, width=3.0]</span> <span class="w" id="mwAiw"> </span><span class="n" id="mwAi0">rectangle</span><span class="p" id="mwAi4">.</span><span class="n" id="mwAi8">display</span><span class="p" id="mwAjA">();</span> <span class="w" id="mwAjE"> </span><span class="n" id="mwAjI">Box</span><span class="w" id="mwAjM"> </span><span class="n" id="mwAjQ">box</span><span class="p" id="mwAjU">(</span><span class="mf" id="mwAjY">6.0</span><span class="p" id="mwAjc">,</span><span class="w" id="mwAjg"> </span><span class="mf" id="mwAjk">5.0</span><span class="p" id="mwAjo">,</span><span class="w" id="mwAjs"> </span><span class="mf" id="mwAjw">4.0</span><span class="p" id="mwAj0">);</span> <span class="w" id="mwAj4"> </span><span class="c1" id="mwAj8">// The pointer to the most overridden method in the vtable in on Box::display,</span> <span class="w" id="mwAkA"> </span><span class="c1" id="mwAkE">// but this call does not illustrate overriding.</span> <span class="w" id="mwAkI"> </span><span class="n" id="mwAkM">box</span><span class="p" id="mwAkQ">.</span><span class="n" id="mwAkU">display</span><span class="p" id="mwAkY">();</span> <span class="w" id="mwAkc"> </span><span class="c1" id="mwAkg">// This call illustrates overriding.</span> <span class="w" id="mwAkk"> </span><span class="c1" id="mwAko">// outputs:</span> <span class="w" id="mwAks"> </span><span class="c1" id="mwAkw">// Rectangle[length=6.0, width=5.0]</span> <span class="w" id="mwAk0"> </span><span class="c1" id="mwAk4">// Box[length=6.0, width=5.0, height=4.0]</span> <span class="w" id="mwAk8"> </span><span class="k" id="mwAlA">static_cast</span><span class="o" id="mwAlE"><</span><span class="n" id="mwAlI">Rectangle</span><span class="o" id="mwAlM">&></span><span class="p" id="mwAlQ">(</span><span class="n" id="mwAlU">box</span><span class="p" id="mwAlY">).</span><span class="n" id="mwAlc">display</span><span class="p" id="mwAlg">();</span> <span class="p" id="mwAlk">}</span>In C++11, similar to Java, a method that is declared final in the super class cannot be overridden; also, a method can be declared override to make the compiler check that it overrides a method in the base class.
Delphi
In Delphi, method overriding is done with the directive override, but only if a method was marked with the dynamic or virtual directives.
The inherited reserved word must be called when you want to call super-class behavior
<span id="mwAmg"></span><span class="k" id="mwAmk">type</span> <span class="w" id="mwAmo"> </span><span class="n" id="mwAms">TRectangle</span><span class="w" id="mwAmw"> </span><span class="o" id="mwAm0">=</span><span class="w" id="mwAm4"> </span><span class="k" id="mwAm8">class</span> <span class="w" id="mwAnA"> </span><span class="kp" id="mwAnE">private</span> <span class="w" id="mwAnI"> </span><span class="n" id="mwAnM">FLength</span><span class="o" id="mwAnQ">:</span><span class="w" id="mwAnU"> </span><span class="kt" id="mwAnY">Double</span><span class="o" id="mwAnc">;</span> <span class="w" id="mwAng"> </span><span class="n" id="mwAnk">FWidth</span><span class="o" id="mwAno">:</span><span class="w" id="mwAns"> </span><span class="kt" id="mwAnw">Double</span><span class="o" id="mwAn0">;</span> <span class="w" id="mwAn4"> </span><span class="kp" id="mwAn8">public</span> <span class="w" id="mwAoA"> </span><span class="k" id="mwAoE">property</span><span class="w" id="mwAoI"> </span><span class="py" id="mwAoM">Length</span><span class="w" id="mwAoQ"> </span><span class="kp" id="mwAoU">read</span><span class="w" id="mwAoY"> </span><span class="nf" id="mwAoc">FLength</span><span class="w" id="mwAog"> </span><span class="kp" id="mwAok">write</span><span class="w" id="mwAoo"> </span><span class="nf" id="mwAos">FLength</span><span class="o" id="mwAow">;</span> <span class="w" id="mwAo0"> </span><span class="k" id="mwAo4">property</span><span class="w" id="mwAo8"> </span><span class="py" id="mwApA">Width</span><span class="w" id="mwApE"> </span><span class="kp" id="mwApI">read</span><span class="w" id="mwApM"> </span><span class="nf" id="mwApQ">FWidth</span><span class="w" id="mwApU"> </span><span class="kp" id="mwApY">write</span><span class="w" id="mwApc"> </span><span class="nf" id="mwApg">FWidth</span><span class="o" id="mwApk">;</span> <span class="w" id="mwApo"> </span><span class="k" id="mwAps">procedure</span><span class="w" id="mwApw"> </span><span class="nf" id="mwAp0">Print</span><span class="o" id="mwAp4">;</span><span class="w" id="mwAp8"> </span><span class="kp" id="mwAqA">virtual</span><span class="o" id="mwAqE">;</span> <span class="w" id="mwAqI"> </span><span class="k" id="mwAqM">end</span><span class="o" id="mwAqQ">;</span> <span class="w" id="mwAqU"> </span><span class="n" id="mwAqY">TBox</span><span class="w" id="mwAqc"> </span><span class="o" id="mwAqg">=</span><span class="w" id="mwAqk"> </span><span class="k" id="mwAqo">class</span><span class="p" id="mwAqs">(</span><span class="n" id="mwAqw">TRectangle</span><span class="p" id="mwAq0">)</span> <span class="w" id="mwAq4"> </span><span class="kp" id="mwAq8">public</span> <span class="w" id="mwArA"> </span><span class="k" id="mwArE">procedure</span><span class="w" id="mwArI"> </span><span class="nf" id="mwArM">Print</span><span class="o" id="mwArQ">;</span><span class="w" id="mwArU"> </span><span class="kp" id="mwArY">override</span><span class="o" id="mwArc">;</span> <span class="w" id="mwArg"> </span><span class="k" id="mwArk">end</span><span class="o" id="mwAro">;</span>
Eiffel
In Eiffel, feature redefinition is analogous to method overriding in C++ and Java. Redefinition is one of three forms of feature adaptation classified as redeclaration. Redeclaration also covers effecting, in which an implementation is provided for a feature which was deferred (abstract) in the parent class, and undefinition, in which a feature that was effective (concrete) in the parent becomes deferred again in the heir class. When a feature is redefined, the feature name is kept by the heir class, but properties of the feature such as its signature, contract (respecting restrictions for preconditions and postconditions), and/or implementation will be different in the heir. If the original feature in the parent class, called the heir feature's precursor, is effective, then the redefined feature in the heir will be effective. If the precursor is deferred, the feature in the heir will be deferred.
The intent to redefine a feature, as message in the example below, must be explicitly declared in the inherit clause of the heir class.
<span id="mwAtI"></span><span class="kr" id="mwAtM">class</span> <span class="w" id="mwAtQ"> </span><span class="nc" id="mwAtU">THOUGHT</span> <span class="kr" id="mwAtY">feature</span> <span class="w" id="mwAtc"> </span><span class="n" id="mwAtg">message</span> <span class="w" id="mwAtk"> </span><span class="c1" id="mwAto">-- Display thought message</span> <span class="w" id="mwAts"> </span><span class="kr" id="mwAtw">do</span> <span class="w" id="mwAt0"> </span><span class="n" id="mwAt4">print</span><span class="w" id="mwAt8"> </span><span class="p" id="mwAuA">(</span><span class="s" id="mwAuE">"I feel like I am diagonally parked in a parallel universe.%N"</span><span class="p" id="mwAuI">)</span> <span class="w" id="mwAuM"> </span><span class="kr" id="mwAuQ">end</span> <span class="kr" id="mwAuU">end</span> <span class="kr" id="mwAuY">class</span> <span class="w" id="mwAuc"> </span><span class="nc" id="mwAug">ADVICE</span> <span class="kr" id="mwAuk">inherit</span> <span class="w" id="mwAuo"> </span><span class="nc" id="mwAus">THOUGHT</span> <span class="w" id="mwAuw"> </span><span class="kr" id="mwAu0">redefine</span> <span class="w" id="mwAu4"> </span><span class="n" id="mwAu8">message</span> <span class="w" id="mwAvA"> </span><span class="kr" id="mwAvE">end</span> <span class="kr" id="mwAvI">feature</span> <span class="w" id="mwAvM"> </span><span class="n" id="mwAvQ">message</span> <span class="w" id="mwAvU"> </span><span class="c1" id="mwAvY">-- Precursor</span> <span class="w" id="mwAvc"> </span><span class="kr" id="mwAvg">do</span> <span class="w" id="mwAvk"> </span><span class="n" id="mwAvo">print</span><span class="w" id="mwAvs"> </span><span class="p" id="mwAvw">(</span><span class="s" id="mwAv0">"Warning: Dates in calendar are closer than they appear.%N"</span><span class="p" id="mwAv4">)</span> <span class="w" id="mwAv8"> </span><span class="kr" id="mwAwA">end</span> <span class="kr" id="mwAwE">end</span>
In class ADVICE the feature message is given an implementation that differs from that of its precursor in class THOUGHT.
Consider a class which uses instances for both THOUGHT and ADVICE:
<span id="mwAxU"></span><span class="kr" id="mwAxY">class</span> <span class="w" id="mwAxc"> </span><span class="nc" id="mwAxg">APPLICATION</span> <span class="kr" id="mwAxk">create</span> <span class="w" id="mwAxo"> </span><span class="n" id="mwAxs">make</span> <span class="kr" id="mwAxw">feature</span><span class="w" id="mwAx0"> </span> <span class="w" id="mwAx4"> </span><span class="n" id="mwAx8">make</span> <span class="w" id="mwAyA"> </span><span class="c1" id="mwAyE">-- Run application.</span> <span class="w" id="mwAyI"> </span><span class="kr" id="mwAyM">do</span> <span class="w" id="mwAyQ"> </span><span class="p" id="mwAyU">(</span><span class="kr" id="mwAyY">create</span><span class="w" id="mwAyc"> </span><span class="p" id="mwAyg">{</span><span class="nc" id="mwAyk">THOUGHT</span><span class="p" id="mwAyo">}).</span><span class="n" id="mwAys">message</span><span class="p" id="mwAyw">;</span> <span class="w" id="mwAy0"> </span><span class="p" id="mwAy4">(</span><span class="kr" id="mwAy8">create</span><span class="w" id="mwAzA"> </span><span class="p" id="mwAzE">{</span><span class="nc" id="mwAzI">ADVICE</span><span class="p" id="mwAzM">}).</span><span class="n" id="mwAzQ">message</span> <span class="w" id="mwAzU"> </span><span class="kr" id="mwAzY">end</span> <span class="kr" id="mwAzc">end</span>When instantiated, class APPLICATION produces the following output:
<span id="mwAz4"></span><span class="go" id="mwAz8">I feel like I am diagonally parked in a parallel universe.</span> <span class="go" id="mwA0A">Warning: Dates in calendar are closer than they appear.</span>
Within a redefined feature, access to the feature's precursor can be gained by using the language keyword Precursor. Assume the implementation of {ADVICE}.message is altered as follows:
<span id="mwA00"></span><span class="w" id="mwA04"> </span><span class="n" id="mwA08">message</span> <span class="w" id="mwA1A"> </span><span class="c1" id="mwA1E">-- Precursor</span> <span class="w" id="mwA1I"> </span><span class="kr" id="mwA1M">do</span> <span class="w" id="mwA1Q"> </span><span class="n" id="mwA1U">print</span><span class="w" id="mwA1Y"> </span><span class="p" id="mwA1c">(</span><span class="s" id="mwA1g">"Warning: Dates in calendar are closer than they appear.%N"</span><span class="p" id="mwA1k">)</span> <span class="w" id="mwA1o"> </span><span class="kc" id="mwA1s">Precursor</span> <span class="w" id="mwA1w"> </span><span class="kr" id="mwA10">end</span>
Invocation of the feature now includes the execution of {THOUGHT}.message, and produces the following output:
<span id="mwA2c"></span><span class="go" id="mwA2g">Warning: Dates in calendar are closer than they appear.</span> <span class="go" id="mwA2k">I feel like I am diagonally parked in a parallel universe.</span>
Java
In Java, when a subclass contains a method with the same signature (name and parameter types) as a method in its superclass, then the subclass's method overrides that of the superclass. Unlike C++ and C#, Java does not have an override keyword, but provides the annotation @Override to indicate that a method is being overriden. It is not necessary, but can be helpful to the compiler. For example:
<span id="mwA3E"></span><span class="kd" id="mwA3I">class</span> <span class="nc" id="mwA3M">Thought</span><span class="w" id="mwA3Q"> </span><span class="p" id="mwA3U">{</span> <span class="w" id="mwA3Y"> </span><span class="kd" id="mwA3c">public</span><span class="w" id="mwA3g"> </span><span class="kt" id="mwA3k">void</span><span class="w" id="mwA3o"> </span><span class="nf" id="mwA3s">message</span><span class="p" id="mwA3w">()</span><span class="w" id="mwA30"> </span><span class="p" id="mwA34">{</span> <span class="w" id="mwA38"> </span><span class="n" id="mwA4A">System</span><span class="p" id="mwA4E">.</span><span class="na" id="mwA4I">out</span><span class="p" id="mwA4M">.</span><span class="na" id="mwA4Q">println</span><span class="p" id="mwA4U">(</span><span class="s" id="mwA4Y">"I feel like I am diagonally parked in a parallel universe."</span><span class="p" id="mwA4c">);</span> <span class="w" id="mwA4g"> </span><span class="p" id="mwA4k">}</span> <span class="p" id="mwA4o">}</span> <span class="kd" id="mwA4s">public</span><span class="w" id="mwA4w"> </span><span class="kd" id="mwA40">class</span> <span class="nc" id="mwA44">Advice</span><span class="w" id="mwA48"> </span><span class="kd" id="mwA5A">extends</span><span class="w" id="mwA5E"> </span><span class="n" id="mwA5I">Thought</span><span class="w" id="mwA5M"> </span><span class="p" id="mwA5Q">{</span> <span class="w" id="mwA5U"> </span><span class="nd" id="mwA5Y">@Override</span> <span class="w" id="mwA5c"> </span><span class="kd" id="mwA5g">public</span><span class="w" id="mwA5k"> </span><span class="kt" id="mwA5o">void</span><span class="w" id="mwA5s"> </span><span class="nf" id="mwA5w">message</span><span class="p" id="mwA50">()</span><span class="w" id="mwA54"> </span><span class="p" id="mwA58">{</span> <span class="w" id="mwA6A"> </span><span class="n" id="mwA6E">System</span><span class="p" id="mwA6I">.</span><span class="na" id="mwA6M">out</span><span class="p" id="mwA6Q">.</span><span class="na" id="mwA6U">println</span><span class="p" id="mwA6Y">(</span><span class="s" id="mwA6c">"Warning: Dates in calendar are closer than they appear."</span><span class="p" id="mwA6g">);</span> <span class="w" id="mwA6k"> </span><span class="p" id="mwA6o">}</span> <span class="p" id="mwA6s">}</span>Class Thought represents the superclass and implements a method call message() . The subclass called Advice inherits every method that could be in the Thought class. Class Advice overrides the method message() , replacing its functionality from Thought .
<span id="mwA8Y"></span><span class="n" id="mwA8c">Thought</span><span class="w" id="mwA8g"> </span><span class="n" id="mwA8k">parking</span><span class="w" id="mwA8o"> </span><span class="o" id="mwA8s">=</span><span class="w" id="mwA8w"> </span><span class="k" id="mwA80">new</span><span class="w" id="mwA84"> </span><span class="n" id="mwA88">Thought</span><span class="p" id="mwA9A">();</span> <span class="n" id="mwA9E">parking</span><span class="p" id="mwA9I">.</span><span class="na" id="mwA9M">message</span><span class="p" id="mwA9Q">();</span><span class="w" id="mwA9U"> </span><span class="c1" id="mwA9Y">// Prints "I feel like I am diagonally parked in a parallel universe."</span> <span class="n" id="mwA9c">Thought</span><span class="w" id="mwA9g"> </span><span class="n" id="mwA9k">dates</span><span class="w" id="mwA9o"> </span><span class="o" id="mwA9s">=</span><span class="w" id="mwA9w"> </span><span class="k" id="mwA90">new</span><span class="w" id="mwA94"> </span><span class="n" id="mwA98">Advice</span><span class="p" id="mwA-A">();</span><span class="w" id="mwA-E"> </span><span class="c1" id="mwA-I">// Polymorphism</span> <span class="n" id="mwA-M">dates</span><span class="p" id="mwA-Q">.</span><span class="na" id="mwA-U">message</span><span class="p" id="mwA-Y">();</span><span class="w" id="mwA-c"> </span><span class="c1" id="mwA-g">// Prints "Warning: Dates in calendar are closer than they appear."</span>
When a subclass contains a method that overrides a method of the superclass, then that (superclass's) overridden method can be explicitly invoked from within a subclass's method by using the keyword super . (It cannot be explicitly invoked from any method belongings to a class that is unrelated to the superclass.) The super reference can be
<span id="mwA_c"></span><span class="kd" id="mwA_g">public</span><span class="w" id="mwA_k"> </span><span class="kd" id="mwA_o">class</span> <span class="nc" id="mwA_s">Advice</span><span class="w" id="mwA_w"> </span><span class="kd" id="mwA_0">extends</span><span class="w" id="mwA_4"> </span><span class="n" id="mwA_8">Thought</span><span class="w" id="mwBAA"> </span><span class="p" id="mwBAE">{</span> <span class="w" id="mwBAI"> </span><span class="nd" id="mwBAM">@Override</span> <span class="w" id="mwBAQ"> </span><span class="kd" id="mwBAU">public</span><span class="w" id="mwBAY"> </span><span class="kt" id="mwBAc">void</span><span class="w" id="mwBAg"> </span><span class="nf" id="mwBAk">message</span><span class="p" id="mwBAo">()</span><span class="w" id="mwBAs"> </span><span class="p" id="mwBAw">{</span> <span class="w" id="mwBA0"> </span><span class="n" id="mwBA4">System</span><span class="p" id="mwBA8">.</span><span class="na" id="mwBBA">out</span><span class="p" id="mwBBE">.</span><span class="na" id="mwBBI">println</span><span class="p" id="mwBBM">(</span><span class="s" id="mwBBQ">"Warning: Dates in calendar are closer than they appear."</span><span class="p" id="mwBBU">);</span> <span class="w" id="mwBBY"> </span><span class="kd" id="mwBBc">super</span><span class="p" id="mwBBg">.</span><span class="na" id="mwBBk">message</span><span class="p" id="mwBBo">();</span><span class="w" id="mwBBs"> </span><span class="c1" id="mwBBw">// Invoke parent's version of method.</span> <span class="w" id="mwBB0"> </span><span class="p" id="mwBB4">}</span>There are methods that a subclass cannot override. For example, in Java, a method that is declared final in the super class cannot be overridden. Methods that are declared private or static cannot be overridden either because they are implicitly final. It is also impossible for a class that is declared final to become a super class.
Kotlin
In Kotlin we can simply override a function like this (note that the function must be open ):
<span id="mwBCw"></span><span class="kd" id="mwBC0">fun</span><span class="w" id="mwBC4"> </span><span class="nf" id="mwBC8">main</span><span class="p" id="mwBDA">()</span><span class="w" id="mwBDE"> </span><span class="p" id="mwBDI">{</span> <span class="w" id="mwBDM"> </span><span class="kd" id="mwBDQ">val</span><span class="w" id="mwBDU"> </span><span class="nv" id="mwBDY">p</span><span class="w" id="mwBDc"> </span><span class="o" id="mwBDg">=</span><span class="w" id="mwBDk"> </span><span class="n" id="mwBDo">Parent</span><span class="p" id="mwBDs">(</span><span class="m" id="mwBDw">5</span><span class="p" id="mwBD0">)</span> <span class="w" id="mwBD4"> </span><span class="kd" id="mwBD8">val</span><span class="w" id="mwBEA"> </span><span class="nv" id="mwBEE">c</span><span class="w" id="mwBEI"> </span><span class="o" id="mwBEM">=</span><span class="w" id="mwBEQ"> </span><span class="n" id="mwBEU">Child</span><span class="p" id="mwBEY">(</span><span class="m" id="mwBEc">6</span><span class="p" id="mwBEg">)</span> <span class="w" id="mwBEk"> </span><span class="n" id="mwBEo">p</span><span class="p" id="mwBEs">.</span><span class="na" id="mwBEw">myFun</span><span class="p" id="mwBE0">()</span> <span class="w" id="mwBE4"> </span><span class="n" id="mwBE8">c</span><span class="p" id="mwBFA">.</span><span class="na" id="mwBFE">myFun</span><span class="p" id="mwBFI">()</span> <span class="p" id="mwBFM">}</span> <span class="kd" id="mwBFQ">open</span><span class="w" id="mwBFU"> </span><span class="kd" id="mwBFY">class</span><span class="w" id="mwBFc"> </span><span class="nc" id="mwBFg">Parent</span><span class="p" id="mwBFk">(</span><span class="kd" id="mwBFo">val</span><span class="w" id="mwBFs"> </span><span class="nv" id="mwBFw">a</span><span class="w" id="mwBF0"> </span><span class="p" id="mwBF4">:</span><span class="w" id="mwBF8"> </span><span class="kt" id="mwBGA">Int</span><span class="p" id="mwBGE">)</span><span class="w" id="mwBGI"> </span><span class="p" id="mwBGM">{</span> <span class="w" id="mwBGQ"> </span><span class="kd" id="mwBGU">open</span><span class="w" id="mwBGY"> </span><span class="kd" id="mwBGc">fun</span><span class="w" id="mwBGg"> </span><span class="nf" id="mwBGk">myFun</span><span class="p" id="mwBGo">()</span><span class="w" id="mwBGs"> </span><span class="o" id="mwBGw">=</span><span class="w" id="mwBG0"> </span><span class="n" id="mwBG4">println</span><span class="p" id="mwBG8">(</span><span class="n" id="mwBHA">a</span><span class="p" id="mwBHE">)</span> <span class="p" id="mwBHI">}</span> <span class="kd" id="mwBHM">class</span><span class="w" id="mwBHQ"> </span><span class="nc" id="mwBHU">Child</span><span class="p" id="mwBHY">(</span><span class="kd" id="mwBHc">val</span><span class="w" id="mwBHg"> </span><span class="nv" id="mwBHk">b</span><span class="w" id="mwBHo"> </span><span class="p" id="mwBHs">:</span><span class="w" id="mwBHw"> </span><span class="kt" id="mwBH0">Int</span><span class="p" id="mwBH4">)</span><span class="w" id="mwBH8"> </span><span class="p" id="mwBIA">:</span><span class="w" id="mwBIE"> </span><span class="n" id="mwBII">Parent</span><span class="p" id="mwBIM">(</span><span class="n" id="mwBIQ">b</span><span class="p" id="mwBIU">)</span><span class="w" id="mwBIY"> </span><span class="p" id="mwBIc">{</span> <span class="w" id="mwBIg"> </span><span class="kd" id="mwBIk">override</span><span class="w" id="mwBIo"> </span><span class="kd" id="mwBIs">fun</span><span class="w" id="mwBIw"> </span><span class="nf" id="mwBI0">myFun</span><span class="p" id="mwBI4">()</span><span class="w" id="mwBI8"> </span><span class="o" id="mwBJA">=</span><span class="w" id="mwBJE"> </span><span class="n" id="mwBJI">println</span><span class="p" id="mwBJM">(</span><span class="s" id="mwBJQ">"overrided method"</span><span class="p" id="mwBJU">)</span> <span class="p" id="mwBJY">}</span>Python
In Python, when a subclass contains a method that overrides a method of the superclass, you can also call the superclass method by calling super(Subclass, self).method instead of self.method. Example:
<span id="mwBK8"></span><span class="k" id="mwBLA">class</span><span class="w" id="mwBLE"> </span><span class="nc" id="mwBLI">Thought</span><span class="p" id="mwBLM">:</span> <span class="k" id="mwBLQ">def</span><span class="w" id="mwBLU"> </span><span class="fm" id="mwBLY">__init__</span><span class="p" id="mwBLc">(</span><span class="bp" id="mwBLg">self</span><span class="p" id="mwBLk">)</span> <span class="o" id="mwBLo">-></span> <span class="kc" id="mwBLs">None</span><span class="p" id="mwBLw">:</span> <span class="nb" id="mwBL0">print</span><span class="p" id="mwBL4">(</span><span class="s2" id="mwBL8">"I'm a new object of type Thought!"</span><span class="p" id="mwBMA">)</span> <span class="k" id="mwBME">def</span><span class="w" id="mwBMI"> </span><span class="nf" id="mwBMM">message</span><span class="p" id="mwBMQ">(</span><span class="bp" id="mwBMU">self</span><span class="p" id="mwBMY">)</span> <span class="o" id="mwBMc">-></span> <span class="kc" id="mwBMg">None</span><span class="p" id="mwBMk">:</span> <span class="nb" id="mwBMo">print</span><span class="p" id="mwBMs">(</span><span class="s2" id="mwBMw">"I feel like I am diagonally parked in a parallel universe."</span><span class="p" id="mwBM0">)</span> <span class="k" id="mwBM4">class</span><span class="w" id="mwBM8"> </span><span class="nc" id="mwBNA">Advice</span><span class="p" id="mwBNE">(</span><span class="n" id="mwBNI">Thought</span><span class="p" id="mwBNM">):</span> <span class="k" id="mwBNQ">def</span><span class="w" id="mwBNU"> </span><span class="fm" id="mwBNY">__init__</span><span class="p" id="mwBNc">(</span><span class="bp" id="mwBNg">self</span><span class="p" id="mwBNk">)</span> <span class="o" id="mwBNo">-></span> <span class="kc" id="mwBNs">None</span><span class="p" id="mwBNw">:</span> <span class="nb" id="mwBN0">super</span><span class="p" id="mwBN4">(</span><span class="n" id="mwBN8">Advice</span><span class="p" id="mwBOA">,</span> <span class="bp" id="mwBOE">self</span><span class="p" id="mwBOI">)</span><span class="o" id="mwBOM">.</span><span class="fm" id="mwBOQ">__init__</span><span class="p" id="mwBOU">()</span> <span class="k" id="mwBOY">def</span><span class="w" id="mwBOc"> </span><span class="nf" id="mwBOg">message</span><span class="p" id="mwBOk">(</span><span class="bp" id="mwBOo">self</span><span class="p" id="mwBOs">)</span> <span class="o" id="mwBOw">-></span> <span class="kc" id="mwBO0">None</span><span class="p" id="mwBO4">:</span> <span class="nb" id="mwBO8">print</span><span class="p" id="mwBPA">(</span><span class="s2" id="mwBPE">"Warning: Dates in calendar are closer than they appear"</span><span class="p" id="mwBPI">)</span> <span class="nb" id="mwBPM">super</span><span class="p" id="mwBPQ">(</span><span class="n" id="mwBPU">Advice</span><span class="p" id="mwBPY">,</span> <span class="bp" id="mwBPc">self</span><span class="p" id="mwBPg">)</span><span class="o" id="mwBPk">.</span><span class="n" id="mwBPo">message</span><span class="p" id="mwBPs">()</span> <span class="n" id="mwBPw">t</span> <span class="o" id="mwBP0">=</span> <span class="n" id="mwBP4">Thought</span><span class="p" id="mwBP8">()</span> <span class="c1" id="mwBQA"># "I'm a new object of type Thought!"</span> <span class="n" id="mwBQE">t</span><span class="o" id="mwBQI">.</span><span class="n" id="mwBQM">message</span><span class="p" id="mwBQQ">()</span> <span class="c1" id="mwBQU"># "I feel like I am diagonally parked in a parallel universe.</span> <span class="n" id="mwBQY">a</span> <span class="o" id="mwBQc">=</span> <span class="n" id="mwBQg">Advice</span><span class="p" id="mwBQk">()</span> <span class="c1" id="mwBQo"># "I'm a new object of type Thought!"</span> <span class="n" id="mwBQs">a</span><span class="o" id="mwBQw">.</span><span class="n" id="mwBQ0">message</span><span class="p" id="mwBQ4">()</span> <span class="c1" id="mwBQ8"># "Warning: Dates in calendar are closer than they appear"</span> <span class="c1" id="mwBRA"># "I feel like I am diagonally parked in a parallel universe.</span> <span class="c1" id="mwBRE"># ------------------</span> <span class="c1" id="mwBRI"># Introspection:</span> <span class="nb" id="mwBRM">isinstance</span><span class="p" id="mwBRQ">(</span><span class="n" id="mwBRU">t</span><span class="p" id="mwBRY">,</span> <span class="n" id="mwBRc">Thought</span><span class="p" id="mwBRg">)</span> <span class="c1" id="mwBRk"># True</span> <span class="nb" id="mwBRo">isinstance</span><span class="p" id="mwBRs">(</span><span class="n" id="mwBRw">a</span><span class="p" id="mwBR0">,</span> <span class="n" id="mwBR4">Advice</span><span class="p" id="mwBR8">)</span> <span class="c1" id="mwBSA"># True</span> <span class="nb" id="mwBSE">isinstance</span><span class="p" id="mwBSI">(</span><span class="n" id="mwBSM">a</span><span class="p" id="mwBSQ">,</span> <span class="n" id="mwBSU">Thought</span><span class="p" id="mwBSY">)</span> <span class="c1" id="mwBSc"># True</span>
Ruby
In Ruby when a subclass contains a method that overrides a method of the superclass, you can also call the superclass method by calling super in that overridden method. You can use alias if you would like to keep the overridden method available outside of the overriding method as shown with 'super_message' below.
Example:
<span id="mwBS4"></span><span class="k" id="mwBS8">class</span><span class="w" id="mwBTA"> </span><span class="nc" id="mwBTE">Thought</span> <span class="w" id="mwBTI"> </span><span class="k" id="mwBTM">def</span><span class="w" id="mwBTQ"> </span><span class="nf" id="mwBTU">message</span> <span class="w" id="mwBTY"> </span><span class="nb" id="mwBTc">puts</span><span class="w" id="mwBTg"> </span><span class="s2" id="mwBTk">"I feel like I am diagonally parked in a parallel universe."</span> <span class="w" id="mwBTo"> </span><span class="k" id="mwBTs">end</span> <span class="k" id="mwBTw">end</span> <span class="k" id="mwBT0">class</span><span class="w" id="mwBT4"> </span><span class="nc" id="mwBT8">Advice</span><span class="w" id="mwBUA"> </span><span class="o" id="mwBUE"><</span><span class="w" id="mwBUI"> </span><span class="no" id="mwBUM">Thought</span> <span class="w" id="mwBUQ"> </span><span class="k" id="mwBUU">alias</span><span class="w" id="mwBUY"> </span><span class="ss" id="mwBUc">:super_message</span><span class="w" id="mwBUg"> </span><span class="ss" id="mwBUk">:message</span> <span class="w" id="mwBUo"> </span><span class="k" id="mwBUs">def</span><span class="w" id="mwBUw"> </span><span class="nf" id="mwBU0">message</span> <span class="w" id="mwBU4"> </span><span class="nb" id="mwBU8">puts</span><span class="w" id="mwBVA"> </span><span class="s2" id="mwBVE">"Warning: Dates in calendar are closer than they appear"</span> <span class="w" id="mwBVI"> </span><span class="k" id="mwBVM">super</span> <span class="w" id="mwBVQ"> </span><span class="k" id="mwBVU">end</span> <span class="k" id="mwBVY">end</span>

