/**
 * Na"ide pa"rimisest ja meetodite u"lekatmisest.
 * @author Jaanus Poial
 * @since 1.5
 * @version 0.5
 */
public class Loomad { 

   /** P6hiprogramm. */
   public static void main (String[] args) {
      Kass minuKass = Kass.luua ("Kiti");
      Koer minuKoer = Koer.luuaNimeta();
      Loom minuLoom = Loom.luuaNimeta();
      minuLoom.paneNimi ("Patu");
      System.out.println (minuKass);
      System.out.println (minuKoer);
      System.out.println (minuLoom);
      minuLoom = minuKoer;
      System.out.println (minuLoom);
      minuLoom = minuKass;
      System.out.println (minuLoom);
      minuKass = (Kass)minuLoom;
      System.out.println (minuKass);
   }
}


/** Ylemklass, tegelikult java.lang.Object alamklass. */
class Loom {

   /** k6igil loomadel on nimi */
   private String nimi;

   /** konstruktor */
   Loom (String s) {
      paneNimi (s);
   }

   /** getter */
   public String votaNimi() {
      return nimi;
   }

   /** setter */
   public void paneNimi (String s) {
      nimi = s;
   }

   /** factory */
   public static Loom luua (String s) {
      return new Loom (s);
   }

   /** another factory */
   public static Loom luuaNimeta() {
      return new Loom ("nimetu");
   }

   /** teisendus s6neks */
   @Override
   public String toString() {
      return "Olen loom " + votaNimi();
   }
}


/** Klassi Loom alamklass. */
class Kass extends Loom { 

   /** Kass omab atribuuti vurrupikkus */
   int vurrupikkus;

   /** konstruktor */
   Kass (String s) {
      super (s);
   }

   /** factory */
   public static Kass luua (String s) {
      return new Kass (s);
   }

   /** another factory */
   public static Kass luuaNimeta() {
      return new Kass ("nimetu");
   }

   /** ylekaetud teisendus s6neks */
   @Override
   public String toString() {
      return super.toString() + " ja sealjuures KASS";
   }
}


/** Klassi Loom alamklass. */
class Koer extends Loom {

   /** kas on saba */
   boolean sabaga;

   /** konstruktor */
   Koer (String s) {
      super (s);
      sabaga = true;
   }

   /** factory */
   public static Koer luua (String s) {
      return new Koer (s);
   }

   /** another factory */
   public static Koer luuaNimeta() {
      return new Koer ("nimetu");
   }
}

