/*
 * [TestExtendingInnerAndNested.java]
 *
 * Summary: How to extend an inner class.
 *
 * Copyright: (c) 2009-2017 Roedy Green, Canadian Mind Products, http://mindprod.com
 *
 * Licence: This software may be copied and used freely for any purpose but military.
 *          http://mindprod.com/contact/nonmil.html
 *
 * Requires: JDK 1.8+
 *
 * Created with: JetBrains IntelliJ IDEA IDE http://www.jetbrains.com/idea/
 *
 * Version History:
 *  1.0 2007-11-21
 */
package com.mindprod.example;

import static java.lang.System.*;

/**
 * How to extend an inner class.
 *
 * @author Roedy Green, Canadian Mind Products
 * @version 1.0 2007-11-21
 * @since 2007-11-21
 */
public final class TestExtendingInnerAndNested
    {
    /**
     * main program to allocate an Outer/Inner/Nested class and extended Outer/Inner/Nested class
     *
     * @param args command line not used.
     */
    public static void main( String[] args )
        {
        // allocate Outer
        Outer o = new Outer();
        // allocate Inner
        Outer.Inner i = o.new Inner();
        out.println( i.indicator() );// prints 0
        // allocate nested
        Outer.Nested n = new Outer.Nested();
        out.println( n.indicator() );// prints 1
        // allocate extended Outer
        OuterE oe = new OuterE();
        // allocate extended Inner
        OuterE.InnerE ie = oe.new InnerE();
        out.println( ie.indicator() );// prints 2
        // allocate extended nested
        OuterE.NestedE ne = new OuterE.NestedE();
        out.println( ne.indicator() );// prints 3
        }
    }

/**
 * base Outer class
 */
class Outer
    {
    /**
     * nested static class
     */
    static class Nested
        {
        int indicator()
            {
            return 1;
            }
        }

    /**
     * Inner class
     */
    class Inner
        {
        int indicator()
            {
            return 0;
            }
        }
    }

/**
 * extended Outer class
 */
class OuterE extends Outer
    {
    /**
     * extended nested static class
     */
    static class NestedE extends Nested
        {
        int indicator()
            {
            return 3;
            }
        }

    /**
     * extended Inner class
     */
    class InnerE extends Inner
        {
        int indicator()
            {
            return 2;
            }
        }
    }