// Output:
        // TestCars3
        // ----------
        // A roof that opens up.
        // Carries seven people.

        public static void TestCars4()
        {
            System.Console.WriteLine("\nTestCars4");
            System.Console.WriteLine("----------");
            Car car2 = new ConvertibleCar();
            Car car3 = new Minivan();

            car2.ShowDetails();
            car3.ShowDetails();
        }
        //static void Main(string[] args)
        //{
        //    // Declare objects of the derived classes and test which version
        //    // of ShowDetails is run, base or derived.
        //    TestCars1();

        //    // Declare objects of the base class, instantiated with the
        //    // derived classes, and repeat the tests.
        //    TestCars2();

        //    // Declare objects of the derived classes and call ShowDetails
        //    // directly.
        //    TestCars3();

        //    // Declare objects of the base class, instantiated with the
        //    // derived classes, and repeat the tests.
        //    TestCars4();
        //}

        public static void TestCars1()
        {
            System.Console.WriteLine("\nTestCars1");
            System.Console.WriteLine("----------");

            Car car1 = new Car();

            car1.DescribeCar();
            System.Console.WriteLine("----------");

            // Notice the output from this test case. The new modifier is
            // used in the definition of ShowDetails in the ConvertibleCar
            // class.
            ConvertibleCar car2 = new ConvertibleCar();

            car2.DescribeCar();
            System.Console.WriteLine("----------");

            Minivan car3 = new Minivan();

            car3.DescribeCar();
            System.Console.WriteLine("----------");
        }