package pokusy;

/*******************************************************************************
 * Testovací třída Dcera slouží k demonstraci funkcí, procesů a závislostí,
 * které souvisejí se zavedenm dědičnosti. 
 *
 * @author    Rudolf Pecinovský
 * @version   1.00,  05.2004
 */
public class Dcera
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================

    /** Počet dosud vytvořených instancí. */
    private static int d_počet  = 0;


//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** Pořadí vytvoření dané instance v rámci třídy. */
    private int d_pořadí = ++d_počet;
    
    /** Název instance určený pro pozdější identifikaci podobjektů. */
    private String název = "Dcera_" + d_počet;


//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ METODY TŘÍDY ======================================================
  
    /***************************************************************************
     * Metoda slouží k demonstraci relativní nezavislosti statických metod
     * na definici stejnojmenné metody v dceřiné třídě.     
     */
    public static void zpráva( String text )
    {
        System.out.println( text + " (D)" );
    }
   
    

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Implicitní konstruktor vypíše na stadnardní výstup zprávu o vytvoření
     * instance s uvedením jejího pořadí.
     * Jsou zde připraveny dvě verze:
     *  - Současná verze těla je určena pro dostupný rodičovský
     *    bezparametrický konstruktor.          
     *  - Zakomentovaný příkaz this() se odkomentuje a druhý příkaz zakomentuje 
     *    tehdy, nebude-li rodičovský bezparametrický konstruktor definován
     *    nebo bude-li definován jako soukromý.       
     */
    public Dcera()
    {
//         this( "" );
        System.out.println( "Vytvářím " + d_pořadí + 
            ". instanci třídy Dcera " );
    }
    

    /***************************************************************************
     * Jednoparametrický konstruktor přidá za zprávu, kterou by vypsal 
     * implicitní konsturktor ještě text, který převzal jako parametr.
     */
    public Dcera( String s )
    {
        super( "- pro dceru " + s );
        System.out.println( "Vytvářím " + d_pořadí + 
            ". instanci třídy Dcera " + s );
    }



//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== PŘEKRYTÉ METODY IMPLEMENTOVANÝCH ROZHRANÍ =================================
//== PŘEKRYTÉ ABSTRAKTNÍ METODY RODIČOVSKÉ TŘÍDY ===============================
//== PŘEKRYTÉ KONKRÉTNÍ METODY RODIČOVSKÉ TŘÍDY ================================

    /***************************************************************************
     * Metoda slouží k demonstraci chování veřejných metod 
     * volaných ze zděděných metod.
     */    
    public void veřejná()
    {
        System.out.println("  Třída Dcera, metoda veřejná(): " + 
                         "\n    Podobjekt: " + název +
                         "\n    Instance:  " + this  );
    }
    

    /***************************************************************************
     * Metoda slouží k demonstraci chování statických metod
     * v hierarchii dědičnosti.
     */    
    public void zprávy()
    {
        zpráva( "\nDcera - moje zpráva" );
//         Matka .zpráva( "- Zpráva matky"  );
//         Dcera .zpráva( "- Zpráva dcery"  );
//         Vnučka.zpráva( "- Zpráva vnučky" );
    }
    

    
//== NOVĚ ZAVEDENÉ METODY INSTANCÍ =============================================

    /***************************************************************************
     * Metoda slouží k demonstraci vlivu překrytí volané metody
     * na funkci volající metody.     
     */
    public void dcera() 
    {
        System.out.println( "\nMetoda dcera() instance " + this +
                            "\n  Název podobjektu: " + název );
        soukromá();
        veřejná();
        System.out.println( název + ".dcera - konec");
    }


    /***************************************************************************
     * Metoda slouží k demonstraci vlivu volání rodičovských verzí 
     * překrytých metod na způsob jejich provedení.
     */
    public void rodiče()
    {
        System.out.println("Dcera - moje verze metody veřejná():");
        veřejná();
        System.out.println("Dcera - rodičovská verze metody veřejná():");
        super.veřejná();
    }



//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Metoda slouží k demonstraci chování soukromých metod 
     * volaných ze zděděných metod.
     */
    private void soukromá()
    {
        System.out.println("  Třída Dcera, metoda soukromá(): " + 
                         "\n    Podobjekt: " + název +
                         "\n    Instance:  " + this  );
    }



//== VNOŘENÉ A VNITŘNÍ TŘÍDY ===================================================
//== TESTY A METODA MAIN =======================================================
}

