Lab #3: Object-oriented programming essentials Get this lab checked off by a TA by the last lab on Tuesday 25 September. 1. Be sure you have all the files associated with this lab, which are README This file Makefile The makefile controlling compilation and testing Tester.java A main program that uses SimpleLists SimpleList.java A class representing a sequence of items ListEntry.java Used in the implementation of SimpleList test1.in, test1.out Input script and expected output for testing. 2. Compile the programs (using gmake) and run Tester to see what is supposed to happen. 3. Add another test input and output file. Try to make the tests reasonably thorough. 4. The SimpleList class (and its "helper" class ListEntry) assume you are dealing with Strings. However, essentially the same code should work for any classes that contain a compareTo method, that is, that implement the Comparable interface discussed in the Friday, 14 September lecture. Modify SimpleList.java and ListEntry.java as needed so as to work on Comparable items. 5. Turn the SimpleList class into an interface called SimpleList (containing the public methods) and a class called LinkedList1 that implements the interface. Modify the Tester.main method as needed to make things continue to compile and work correctly. (Put LinkedList1 into file LinkedList1.java) 6. Copy LinkedList1.java to LinkedList2.java, and modify LinkedList2.java so that its class is called LinkedList2. 7. Modify LinkedList2.java to remove the private methods, and make all the methods non-recursive. That is, re-implement the methods using loops (while or for). 8. Modify Tester.main to test the LinkedList2 class, changing ONLY Tester.main. 9. Copy LinkedList2.java to LinkedList3.java, and again modify to make the class name LinkedList3. Again, modify Tester.main to test it. We are now going to re-implement LinkedList3 along the lines I used in the Friday lecture for the Reader classes. 10. Create an abstract class AbstractSimpleList that implements SimpleList (in file AbstractSimpleList.java). In this class, put implementations of add(*) (the one-argument method) and isOrdered(), leaving as abstract the public definitions of get(*), length(), and add (*, *). The AbstractSimpleList class must contain no variables (neither instance nor static variables). You may have to re-implement the add(*) and isOrdered() methods to use only the other (abstract) public methods, and not mention the instance variables. 11. Now re-implement the LinkedList3 class by having it extend AbstractSimpleList and then override only the abstract methods. As always, test. 12. Show what you've done to your TA for check-off. Be prepared to exlain your own work, of course, but also how Tester.java works, and how the Makefile works.