Exemple #1
0
        static void Main(string[] args)
        {
            var rand        = new Random();
            var lengthArray = rand.Next(10, 21);
            var arrFigures  = new Figure[lengthArray];

            //генерируем массив фигур со случайными значениями
            for (int i = 0; i < arrFigures.Length; i++)
            {
                var randomNumber14 = rand.Next(1, 5); // 1 2 3 4 - случайную фигуру
                switch (randomNumber14)
                {
                case 1:                                                                                                         // Upcasting преобразование наследуемого класса к базовому Figure. Базовому классу не доступны поля, свойства, методы наследуемого
                    arrFigures[i] = new Parallelepiped(rand.NextDouble() * 10, rand.NextDouble() * 10, rand.NextDouble() * 10); // от 1 до 10
                    //почему-то тут не так. Экземпляру arrFigures[i] доступны свойства Name Volume и метод SetVolume
                    //Console.WriteLine(arrFigures[i].X); //- ошибка
                    //arrFigures[i].Name != "BaseName" . Потому что Name, Volume есть и в базовом классе,  с SetName() аналогично
                    // А вот X Y Z будет недоступно - эти свойства принадлежат Parallelepiped и не видны базовому классу при upкасте
                    break;

                case 2:
                    arrFigures[i] = new Pyramid(rand.NextDouble() * 10, rand.NextDouble() * 10, rand.NextDouble() * 10);
                    break;

                case 3:
                    arrFigures[i] = new Tetrahedron(rand.NextDouble() * 10);
                    break;

                case 4:
                    arrFigures[i] = new Ball(rand.NextDouble() * 10);
                    break;

                default:
                    throw new Exception();     // никогда сюда не должно прийти - заглушка, надо ли такое писать?
                }
            }

            //проверка правильности. Проверяем тип текущей фигуры и считаем "вручную", выводим результаты ручных подсчётов и подсчётов функцией экземпляра
            for (int i = 0; i < arrFigures.Length; i++)
            {
                var    currentFigure = arrFigures[i];
                double checkVolume   = -1;

                if (currentFigure is Parallelepiped)
                {
                    var tempF = currentFigure as Parallelepiped; // Downcasting
                    checkVolume = tempF.X * tempF.Y * tempF.Z;
                }
                else if (currentFigure is Pyramid)
                {
                    var tempF = (Pyramid)currentFigure; // вариант преобразования
                    checkVolume = tempF.X * tempF.Y * tempF.H / 3;
                }
                else if (currentFigure is Tetrahedron)
                {
                    var tempF = currentFigure as Tetrahedron;
                    checkVolume = Math.Pow(tempF.A, 3) * Math.Sqrt(2) / 12;
                }
                else if (currentFigure is Ball)
                {
                    var tempF = currentFigure as Ball;
                    checkVolume = 4 * Math.PI * Math.Pow(tempF.R, 3) / 3;
                }
                else
                {
                    Console.WriteLine("Error1");
                }

                Console.WriteLine($"V = {currentFigure.Volume:f2}\tCHECK: {checkVolume:f2}\t: {currentFigure.Name}");
            }
        }
Exemple #2
0
        static void Main(string[] args)
        {
            var rand        = new Random();
            var lengthArray = rand.Next(10, 21);
            var arrIFigures = new IFigure[lengthArray];

            //генерируем массив фигур со случайными значениями
            for (int i = 0; i < arrIFigures.Length; i++)
            {
                var randomNumber14 = rand.Next(1, 5); // 1 2 3 4 - случайную фигуру
                switch (randomNumber14)
                {
                case 1:
                    arrIFigures[i] = new Parallelepiped(rand.NextDouble() * 10, rand.NextDouble() * 10, rand.NextDouble() * 10);     // от 1 до 10
                    break;

                case 2:
                    arrIFigures[i] = new Pyramid(rand.NextDouble() * 10, rand.NextDouble() * 10, rand.NextDouble() * 10);
                    break;

                case 3:
                    arrIFigures[i] = new Tetrahedron(rand.NextDouble() * 10);
                    break;

                case 4:
                    arrIFigures[i] = new Ball(rand.NextDouble() * 10);
                    break;

                default:
                    throw new Exception();     // никогда сюда не должно прийти - заглушка, надо ли такое писать?
                }
            }

            //Проверяем тип текущей фигуры и считаем "вручную", выводим результаты ручных подсчётов и подсчётов функцией экземпляра
            for (int i = 0; i < arrIFigures.Length; i++)
            {
                var    currentIFigure = arrIFigures[i];
                double checkVolume    = -1;

                if (currentIFigure is Parallelepiped)
                {
                    var tempF = currentIFigure as Parallelepiped; // Downcasting
                    checkVolume = tempF.X * tempF.Y * tempF.Z;
                }
                else if (currentIFigure is Pyramid)
                {
                    var tempF = (Pyramid)currentIFigure; // вариант преобразования
                    checkVolume = tempF.X * tempF.Y * tempF.H / 3;
                }
                else if (currentIFigure is Tetrahedron)
                {
                    var tempF = currentIFigure as Tetrahedron;
                    checkVolume = Math.Pow(tempF.A, 3) * Math.Sqrt(2) / 12;
                }
                else if (currentIFigure is Ball)
                {
                    var tempF = currentIFigure as Ball;
                    checkVolume = 4 * Math.PI * Math.Pow(tempF.R, 3) / 3;
                }
                else
                {
                    Console.WriteLine("Error1");
                }

                Console.WriteLine($"V = {currentIFigure.Volume:f2}\tCHECK: {checkVolume:f2}\t: {currentIFigure.Name}");
            }
        }