static void Main(string[] args)
        {
            // --------------------------------------------------------------------------------------------------------------------------------------------------------
            //Methods available for instance of class that inherits from 1 abstract class and 2 interfaces, created as : class object = new class()
            BasicClass BasicBasicObject = new BasicClass(); // N E W     O B J E C T        N E W     O B J E C T        N E W     O B J E C T

            // --- its own fields, properties and methods

            int _itsOwnInt = BasicBasicObject.itsOwnInt;

            int _ItsOwnIntProperty = BasicBasicObject.ItsOwnIntProperty;

            BasicBasicObject.ItsOwnMethod();

            // --- fields, properties and methods from abstract class and interfaces

            string __stringFieldAbstractClass = BasicBasicObject.stringFieldAbstractClass;

            char __CharPropertyAbstractClass = BasicBasicObject.CharPropertyAbstractClass;

            BasicBasicObject.AbstractMethodAbstractClass();

            BasicBasicObject.VirtualMethodAbstractClass();

            BasicBasicObject.VoidMethodAbstractClass();

            BasicBasicObject.VoidMethodInterface1();

            BasicBasicObject.VoidMethodInterface2();

            // does not contain properties of both interfaces, contains methods from both interfaces and everything from AbstractClass



            // --------------------------------------------------------------------------------------------------------------------------------------------------------
            // Methods available for instance of class that inherits from Abstract Class, created as : abstract class object = new realClass()
            AbstractClass AbstractBasicObject = new BasicClass(); // N E W     O B J E C T        N E W     O B J E C T        N E W     O B J E C T

            // does not contain any of its own (BasicClass) fields, properties or methods

            string _stringFieldAbstractClass = AbstractBasicObject.stringFieldAbstractClass;

            char _CharPropertyAbstractClass = AbstractBasicObject.CharPropertyAbstractClass;

            AbstractBasicObject.AbstractMethodAbstractClass();

            AbstractBasicObject.VirtualMethodAbstractClass();

            AbstractBasicObject.VoidMethodAbstractClass();

            // contains methods, properties and fields from Abstract Class (overriden and not overriden)


            // --------------------------------------------------------------------------------------------------------------------------------------------------------
            // Methods available for instance of class that implements Interface1
            Interface1 Interface1BasicObject = new BasicClass(); // N E W     O B J E C T        N E W     O B J E C T        N E W     O B J E C T

            // does not contain any of its own (BasicClass) fields, properties or methods

            int _IntPropertyInterface1 = Interface1BasicObject.IntPropertyInterface1;

            Interface1BasicObject.VoidMethodInterface1();

            // contains only properties and methods that were forced to implement by this interface1


            // --------------------------------------------------------------------------------------------------------------------------------------------------------
            // Methods available for instance of class that implements Interface2
            Interface2 Interface2BasicObject = new BasicClass(); // N E W     O B J E C T        N E W     O B J E C T        N E W     O B J E C T

            // does not contain any of its own (BasicClass) fields, properties or methods

            double _DoublePropertyInterface2 = Interface2BasicObject.DoublePropertyInterface2;

            Interface2BasicObject.VoidMethodInterface2();

            // contains only properties and methods that were forced to implement by this interface2
        }