public static void main(string[] args)
        {
            // create five-element Employee array
            Employee[] employees = new Employee[4];

            // initialize array with Employees
            employees[0] = new SalariedEmployee("John", "Smith",
               "111-11-1111", 800M);
            employees[1] = new HourlyEmployee("Karen", "Price",
               "222-22-2222", 16.75M, 40M);
            employees[2] = new CommissionEmployee("Sue", "Jones",
               "333-33-3333", 10000M, .06M);
            employees[3] = new BasePlusCommissionEmployee("Bob", "Lewis",
               "444-44-4444", 5000M, .04M, 300M);

            Console.WriteLine("Employees processed polymorphically:\n");

            // generically process each element in array employees
            foreach (var currentEmployee in employees)
            {
                Console.WriteLine(currentEmployee); // invokes ToString
                Console.WriteLine("earned {0:C}\n",
                   currentEmployee.GetPaymentAmount());
            } // end foreach

            Console.Read();
        }
        public static void Main(string[] args)
        {
            IPayable[] payableObjects = new IPayable[7];

            payableObjects[0] = new Invoice("01234", "seat", 2, 375.00M );
            payableObjects[1] = new Invoice("56789", "tire", 4, 79.95M);
            payableObjects[ 2 ] = new HourlyEmployee( "John", "Smith",
                "111-11-1111", 15.75M, 40);
            payableObjects[ 3 ] = new SalariedEmployee( "Lisa", "Barnes",
                "888-88-8888", 1200.00M);
            payableObjects[4] = new CommissionEmployee("Kory", "Barnes",
                "777-77-7777", 1800.00M, .75M);
            payableObjects[5] = new BasePlusCommissionEmployee("Grant", "Brick",
                "555-55-5555", 5000.00M, .5M, 80000.00M);
            payableObjects[6] = new PieceWorker("Greg", "Jones", "999-99-999", 80.00M, 800.00M);

            Console.Write(
                "Invoices and Employees processed polymoprhically:\n");

            foreach(var currentPayable in payableObjects)
            {
                Console.WriteLine("{0}\npayment due: {1:C}\n",
                    currentPayable, currentPayable.GetPaymentAmount());
            }
        }
        static void Main(string[] args)
        {
            // create birthday objects for each employee
            var birthday1 = new Date(2, 15, 1963);
            var birthday2 = new Date(4, 15, 1992);
            var birthday3 = new Date(9, 19, 1971);
            var birthday4 = new Date(12, 1, 1987);

            // create derived-class objects
            var salariedEmployee           = new SalariedEmployee("Jim", "Miller", "777-77-7777", birthday1, 2650.00M);
            var hourlyEmployee             = new HourlyEmployee("Thomas", "Swoon", "888-88-8888", birthday2, 27.0M, 40.0M);
            var commissionEmployee         = new CommissionEmployee("Sam", "Overton", "444-44-4444", birthday3, 8650.00M, .15M);
            var basePlusCommissionEmployee = new BasePlusCommissionEmployee("Rufus", "Mitchell", "333-33-3333", birthday4, 12520.00M, .08M, 100.00M);

            Console.WriteLine("Employee processed individually:\n");
            Console.WriteLine($"{salariedEmployee}\nearned: " + $"{salariedEmployee.Earnings():C}\n");
            Console.WriteLine($"{hourlyEmployee}\nearned: {hourlyEmployee.Earnings():C}\n");
            Console.WriteLine($"{commissionEmployee}\nearned: " + $"{commissionEmployee.Earnings():C}\n");
            Console.WriteLine($"{basePlusCommissionEmployee}\nearned: " + $"{basePlusCommissionEmployee.Earnings():C}\n");

            // create List<Employee> and initialize with employee objects
            var employees = new List <Employee>()
            {
                salariedEmployee, hourlyEmployee, commissionEmployee, basePlusCommissionEmployee
            };

            // create array with the employee's birthday months
            int[] birthdayMonths = { birthday1.Month, birthday2.Month, birthday3.Month, birthday4.Month };

            string[] monthsList = { "null", "Jan.", "Feb.", "Mar.", "Apr.", "May", "June", "July", "Aug.", "Sept.", "Oct.", "Nov.", "Dec." };


            Console.WriteLine("Employees processed polymorphically:\n");

            // counter to index though employee's birthday months list
            int counter = 0;

            // generically process each element in employees
            foreach (var currentEmployee in employees)
            {
                // varibale to add the employees monthly eranings
                decimal total = 0;
                Console.WriteLine(currentEmployee); // invokes ToString

                // display each employee monthly earning and birthday month bonus
                for (int months = 1; months <= 12; ++months)
                {
                    int currentEmployeeBirthdayMonth = birthdayMonths[counter];

                    if (currentEmployeeBirthdayMonth == months)
                    {
                        decimal monthlyBonus = currentEmployee.Earnings() + 100.0M;
                        Console.WriteLine($"{monthsList[months],12}: {monthlyBonus,10:C} Bonus Month!");
                        total += monthlyBonus;
                    }
                    else
                    {
                        Console.WriteLine($"{monthsList[months],12}: {currentEmployee.Earnings(),10:C}");
                        total += currentEmployee.Earnings();
                    }
                }

                // display total earnings
                Console.WriteLine($"Total earned: {total:C}\n");

                // incrementing the index counter
                counter++;
            }
            Console.ReadLine();
        }