abstract class AncTree { abstract int size(); abstract java.util.List allNames( /* AncTree this */ ); /* Representing union-types by using classes * is called the 'composite design pattern'. * (And usually it's not recognized that they're taking the * union of two different types(sets).) * See for example: * http://sourcemaking.com/design_patterns/composite */ /** Some test cases for AncTrees. * @param args -- ignored. */ public static void main( String[] args ) { AncTree abe = new Child( "Abe", 1920, "brown", new Unknown(), new Unknown() ); AncTree mona = new Child( "Mona", 1929, "blue", new Unknown(), new Unknown() ); AncTree homer = new Child( "Homer", 1955, "brown", mona, abe ); AncTree bart = new Child( "Bart", 1956, "brown", new Child( "Marge", 1953, "blue", new Child( "Jackie", 1926, "brown", new Unknown(), new Unknown() ), new Unknown() ), homer ); System.out.println( "Actual: " + (new Unknown()).size() ); System.out.println( "Expect: " + 0); System.out.println( "Actual: " + abe.size() ); System.out.println( "Expect: " + 1); System.out.println( "Actual: " + homer.size() ); System.out.println( "Expect: " + 3); System.out.println( "Actual: " + bart.size() ); System.out.println( "Expect: " + 6); System.out.println( "Actual: " + homer.allNames() ); System.out.println( "Expect: " + java.util.Arrays.asList("Mona","Homer","Abe") ); System.out.println( "Actual: " + bart.allNames() ); System.out.println( "Expect: " + java.util.Arrays.asList("Jackie", "Marge", "Bart", "Mona","Homer","Abe") ); //System.out.println( "Actual: " + homer.entitle() ); //System.out.println( "Expect: " + homer.entitle() ); /* System.out.println( "Actual: " + abe.toString() ); System.out.println( "Expect: " + "new Child( \"Abe\", 1920, \"brown\", new Unknown(), new Unknown() )" ); System.out.println( "Actual: " + homer.toString() ); System.out.println( "Expect: " + "??" ); */ } }