import java.util.*;

public class TestPerson {
	
	public static void main(String[] args) {
	
		/* members holds elements of type Person */
		/* variables of type Person can refer to instances
		   of type Person, Student, Undergrad, and Grad
		 */
		Person[] members = new Person[9];
		members[0] = new Person("Rudolph", "Jan 10");
		members[1] = new Student("Dasher", "Jan 11", "252525");
		members[2] = new Undergrad("Dancer", "Jan 12", 
							"343434", "Drama");
		members[3] = new Grad("Prancer", "Jan 13", 
							"454545", "Aerodynamics");
		members[4] = new Student("Vixen", "Jan 14", "565656");
		members[5] = new Person("Comet", "Jan 15");
		members[6] = new Grad("Cupid", "Feb 14", "676767",
							"Literature");
		members[7] = new Student("Donner", "Jan 16", "787878");
		members[8] = new Person("Blizten", "Jan 17");
		
		/* Print out the names of all members */
		System.out.println("Members names:");
		for(int i = 0; i < members.length; i++) {
			System.out.println(members[i].getName());
		}
	
		/* Print out each object in members */
		/* Which toString method is called? The one in Person
		 * or the one in the instance type? (The one in the 
		 * instance type).
		 */
		System.out.println("Members:");
		for(int i = 0; i < members.length; i++) {
			System.out.println(members[i].toString());
		}

			
		/* Print out the names and student numbers of all
		 * students 
		 */
		System.out.println("Student names and numbers");
		for(int i = 0; i < members.length; i++) {
			if(members[i] instanceof Student) {
				System.out.println(members[i].getName() +
					" " + 
					((Student)members[i]).getStudentNumber());
			} else {
				System.out.println(members[i].getName() +
					" Not a student\n");
			}
		}
				
	}
}

class Person {
	private String name;
	private String birthdate;
	
	public Person(String name, String birthdate) {
		this.name = name;
		this.birthdate = birthdate;
	}
	
	public String getName() {
		return name;
	}
	
	public String toString() {
		String result = "Name: " + name;
		result += "\tBirthdate: " + birthdate;
		return result;
	}
}

class Student extends Person {
	private String stunum;

	public Student(String name, String date, String num) {
		super(name, date);
		stunum = num;
	}
	
	public String toString() {	
		String result = super.toString();
		result += "\tStudent number: " + stunum;
		return result;
	}
	public String getStudentNumber() {
		return stunum;
	}
}

class Undergrad extends Student{
	private String program;
	
	public Undergrad(String name, String date, String num,
					String program) {
		super(name, date, num);
		this.program = program;
	}
	
	public String toString() {	
		String result = "Undergrad:\n" + super.toString();
		result += "\tProgram: " + program;
		return result;
	}
}

class Grad extends Student {
	private String area;
	
	public Grad(String name, String date, String num,
				String area) {
		super(name, date, num);
		this.area = area;
	}
	
	public String toString() {
		String result = "Grad:\n" + super.toString();
		result += "\tResearch area: " + area;
		return result;
	}
}