fork download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6.  
  7. interface IMarker { }
  8. interface IWorker { public void work(); }
  9.  
  10. class UnmarkedWorker implements IWorker {
  11. public void work() { System.out.println("work work"); }
  12. }
  13.  
  14. class MarkedWorker implements IWorker, IMarker {
  15. public void work() { System.out.println("work work"); }
  16. }
  17.  
  18. class PromotedWorker implements IWorker, IMarker {
  19. private final IWorker worker;
  20.  
  21. public PromotedWorker(IWorker worker) {
  22. this.worker = worker;
  23. }
  24.  
  25. public void work() { worker.work(); }
  26. }
  27.  
  28. class Foreman {
  29. public void drive(IWorker worker) {
  30. if(worker instanceof IMarker) {
  31. System.out.print("*: ");
  32. }
  33. worker.work();
  34. }
  35. }
  36.  
  37. /* Name of the class has to be "Main" only if the class is public. */
  38. class Ideone
  39. {
  40. public static void main (String[] args) throws java.lang.Exception
  41. {
  42. Foreman bob = new Foreman();
  43. System.out.println("Foreman bob drives an UnmarkedWorker:");
  44. bob.drive(new UnmarkedWorker());
  45. System.out.println("Foreman bob drives a MarkedWorker:");
  46. bob.drive(new MarkedWorker());
  47. System.out.println("Foreman bob drives a promoted UnmarkedWorker:");
  48. bob.drive(new PromotedWorker(new UnmarkedWorker()));
  49. }
  50. }
Success #stdin #stdout 0.1s 320512KB
stdin
Standard input is empty
stdout
Foreman bob drives an UnmarkedWorker:
work work
Foreman bob drives a MarkedWorker:
*: work work
Foreman bob drives a promoted UnmarkedWorker:
*: work work