Refactoring Day 17 : Extract Superclass


Today’s refactoring is from Martin Fowler’s refactoring catalog. You can find the original description here

This refactoring is used quite often when you have a number of methods that you want to “pull up” into a base class to allow other classes in the same hierarchy to use. Here is a class that uses two methods that we want to extract and make available to other classes.

   1: public class Dog
<pre><span class="lnum">   2:</span> {</pre>

<pre><span class="lnum">   3:</span>     <span class="kwrd">public</span> <span class="kwrd">void</span> EatFood()</pre>

<pre><span class="lnum">   4:</span>     {</pre>

<pre><span class="lnum">   5:</span>         <span class="rem">// eat some food</span></pre>

<pre><span class="lnum">   6:</span>     }</pre>

<pre><span class="lnum">   7:</span>&nbsp; </pre>

<pre><span class="lnum">   8:</span>     <span class="kwrd">public</span> <span class="kwrd">void</span> Groom()</pre>

<pre><span class="lnum">   9:</span>     {</pre>

<pre><span class="lnum">  10:</span>         <span class="rem">// perform grooming</span></pre>

<pre><span class="lnum">  11:</span>     }</pre>

<pre><span class="lnum">  12:</span> }</pre>

After applying the refactoring we just move the required methods into a new base class. This is very similar to the [pull up refactoring], except that you would apply this refactoring when a base class doesn’t already exist.

   1: public class Animal
<pre><span class="lnum">   2:</span> {</pre>

<pre><span class="lnum">   3:</span>     <span class="kwrd">public</span> <span class="kwrd">void</span> EatFood()</pre>

<pre><span class="lnum">   4:</span>     {</pre>

<pre><span class="lnum">   5:</span>         <span class="rem">// eat some food</span></pre>

<pre><span class="lnum">   6:</span>     }</pre>

<pre><span class="lnum">   7:</span>&nbsp; </pre>

<pre><span class="lnum">   8:</span>     <span class="kwrd">public</span> <span class="kwrd">void</span> Groom()</pre>

<pre><span class="lnum">   9:</span>     {</pre>

<pre><span class="lnum">  10:</span>         <span class="rem">// perform grooming</span></pre>

<pre><span class="lnum">  11:</span>     }</pre>

<pre><span class="lnum">  12:</span> }</pre>

<pre><span class="lnum">  13:</span>&nbsp; </pre>

<pre><span class="lnum">  14:</span> <span class="kwrd">public</span> <span class="kwrd">class</span> Dog : Animal</pre>

<pre><span class="lnum">  15:</span> {</pre>

<pre><span class="lnum">  16:</span> }</pre>

This is part of the 31 Days of Refactoring series. For a full list of Refactorings please see the original introductory post.

← Refactoring Day 16 : Encapsulate Conditional
Refactoring Day 18 : Replace exception with conditional →