interface PTTPlayer extends ParentInterface{
    void goPTT();
    //all (instance) methods must be abstract
    //no static methods
    //no instance variables
    //static variable? -- static final variables
    //everything is public
}

interface TVWatcher{
    abstract public void watchTV();
}

abstract class Professor{
    abstract public void teach();
}

abstract class Student{
    abstract public void play();
}

class CSIEStudent extends Student implements PTTPlayer, TVWatcher{
    public void watchTV(){
	System.out.println("CSIEStudent watch TV");		
    }

    public void goPTT(){
	System.out.println("CSIEStudent login to PTT");	
    }

    public void play(){
	//...
	goPTT();
	watchTV();
	//...
    }
}

class CSIEProfessor extends Professor implements PTTPlayer{
    public void goPTT(){
	System.out.println("CSIEProfessor login to PTT");
    }

    private void teachOOP(){
	System.out.println("teaching OOP");	
	//tell a joke
	//build motivation
	//open emacs
	//type in java code
    }

    public void teach(){
	teachOOP();
    }
}

class LawProfessor extends Professor{
    private void teachLaw(){
	System.out.println("teaching Law");	
    }

    public void teach(){
	teachLaw();
    }
}

public class AbstractDemo{
    public static void main(String[] argv){
	PTTPlayer o;
	o = new CSIEProfessor();
	o.goPTT();

	o = new CSIEStudent();
	o.goPTT();

	TVWatcher t;
	t = new CSIEStudent();
	t.watchTV();

	/*
	t = new CSIEProfessor();
	t.watchTV();
	*/

	/*
	Professor p;

	p = new CSIEProfessor();
	p.teach();

	p = new LawProfessor();
	p.teach();

	p = new EmptyProfessor();
	p.teach(); //calls something empty
	*/
    }
}
