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> </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> </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> </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.
