package pokusy;

/*******************************************************************************
 * Testovací třída Vnučka 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 Vnučka
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================

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


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

    /** Pořadí vytvoření dané instance v rámci třídy. */
    private int v_pořadí = ++v_počet;

    /** Název instance určený pro pozdější identifikaci podobjektů. */
    private String název = "Vnučka_" + v_počet;


//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ METODY TŘÍDY ======================================================

    /***************************************************************************
     * Metoda slouží k demonstraci relativní nezávislosti statických metod
     * na definici stejnojmenné metody v dceřiné třídě.
     * V této třídě je metoda zakomentována proto, aby bylo lze pozorovat
     * chování instance v případě, kdy metoda není překryta.
     */
//     public static void zpráva( String text )
//     {
//         System.out.println( text + " (V)" );
//     }



//##############################################################################
//== 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:
     */
    public Vnučka()
    {
        System.out.println( "Vytvářím " + v_pořadí +
            ". instanci třídy Vnučka " );
    }


    /***************************************************************************
     * Jednoparametrický konstruktor přidá za zprávu, kterou by vypsal
     * implicitní konsturktor ještě text, který převzal jako parametr.
     */
    public Vnučka( String s )
    {
        super( "- pro vnučku " + s );
        System.out.println( "Vytvářím " + v_pořadí +
            ". instanci třídy Vnučka " + 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 Vnučka, 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( "\nVnučka - 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 vnučka()
    {
        System.out.println( "\nMetoda vnučka() instance " + this +
                            "\n  Název podobjektu: " + název );
        soukromá();
        veřejná();
        System.out.println( název + ".vnučka - konec");
    }


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



//== 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 Vnučka, metoda soukromá(): " +
                         "\n    Podobjekt: " + název +
                         "\n    Instance:  " + this  );
    }



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

