К основному контенту

Наследование, индексаторы, полиморфизм, Override, virtual C#.NET

Не спрашивайте почему я пишу уже на шарпе :)
Программы с подробнейшими комментариями.



//Создать класс Circle, разработав следующие элементы класса:
//d. Поля:
//• double x, y; // координаты центра круга
//• double r; // радиус круга
//e. Конструктор, позволяющий создать экземпляр класса:
//• с одним параметром,  задающим  радиус круга с центром в начале координат;
//• с тремя параметрами.
//f. Методы, позволяющие:
//• вывести радиус и координаты центра круга на экран;
//• получить площадь круга;
//• переместить круг на плоскости в заданную точку .
//В класс Circle добавить:
//c. Свойства:
//• позволяющие получить-установить координаты центра круга (доступные для чтения и записи);
//• позволяющее получить-установить значение радиуса круга (доступное для чтения и записи).
//d. Индексатор, позволяющий по индексу 0 получить значение площади круга, по индексу 1 – получить значение периметра круга, по индексу 2 получить значение диаметра круга.

using System;
namespace Работа_шарп_1_2
{
    class Circle
    {
        protected double x;
        protected double y; // координаты центра круга
        protected double r; // радиус круга
        public Circle(double X, double Y, double R) //конструктор с тремя параметрами
        {
            x = X;
            y = Y;
            r = R;
        }
        public Circle(double R) //конструктор с одним параметром,  задающим  радиус круга с центром в начале координат;
        {
            x = 0;
            y = 0;
            r = R;
        }
        public void display()//метод вывода на экран
        {
            Console.WriteLine("X = " + x + "\nY = " + y + "\nR = " + r);
        }
        public void Square()//метод нахождения площади
        {
            Console.WriteLine("Площадь круга  = " + Math.PI*r*r);
        }
        public void movement(double X, double Y)//метод перемешения
        {
            this.x = X;
            this.y = Y;
        }
        //геттеры для чтения
        public double getX()
        {
            return x;
        }
        public double getY()
        {
            return y;
        }
         public double getR()
        {
            return r;
        }
         //сеттеры для чтения
         public void setX(double n)
         {
             x = n;
         }
         public void setY(double n)
         {
             y = n;
         }
         public void setR(double n)
         {
             r = n;
         }
         public double this[int i]//индексатор
         {
             get//получаем значение индекса
             {
                 switch (i)//перебор по значениям
                 {
                     case 0: return Math.PI * r * r;
                     case 1: return 2*Math.PI*r;
                     case 2: return 2*r;
                     default: throw new IndexOutOfRangeException("Отсуствует эл." + i);// вызываем исключение если введен индекс не входящий в cases
                 }
             }
         }

        static void Main(string[] args)
        {
            Circle circle1 = new Circle(1, 2, 3);//использование конструктора с 3 параметрами
            Circle circle2 = new Circle(8);//использование конструктора с 1 параметром
            Console.WriteLine("вывод на экран первого объекта");
            circle1.display();//вывод на экран первого объекта
            Console.WriteLine("вывод на экран второго объекта");
            circle2.display();//вывод на экран второго объекта
            Console.WriteLine("площадь второго объекта");
            circle2.Square();//вывод на экран площади
            circle1.movement(6, 7);//демонстрация метода перемещения
            Console.WriteLine("Перемещение первого объекта");
            circle1.display();
            Console.WriteLine("Получение всех свойств объекта два");
            Console.WriteLine("Х = " + circle2.getX() + "\nY = " + circle2.getY() + "\nR = " + circle2.getR());
            //Устанавливаем свойства:
            circle2.setX(6);
            circle2.setY(5);
            circle2.setR(4);
            Console.WriteLine("просмотр переустановленных свойств");
            circle2.display();//просмотр переустановленных свойств объекта 2
            Console.WriteLine("Индексатор, позволяющий по индексу 0 получить значение площади круга, по индексу 1 – получить значение периметра круга, по индексу 2 получить значение диаметра круга:");
            for (int i = 0; i < 3; i++)
            {
                Console.WriteLine(circle2[i]);
            }
        }
    }
}

//Точка, треугольник, треугольная пирамида

//а) Наследование. Определите иерархию  классов (см. варианты), связанных отношением наследования. Определите в этих классах методы, которые перемещает фигуру по плоскости, возвращают ее площадь, периметр (для объемных  фигур – периметр основания), и строку символов, отражающую имя класса и состояние объекта.  Продемонстрируйте  работу   с классами.

using System;

namespace Inheritance
{
    class Point //класс точки
    {
        protected double X;
        protected double Y;

        public Point(double x, double y) //конструктор с параметрами
        {
            X = x;
            Y = y;
        }
        public Point() //конструктор без параметров задает по умолчанию все ноли
        {
            X = 0;
            Y = 0;
        }

        public virtual void move()//виртуальный метод сдвига
        {
            Console.WriteLine("Введите на какое число переместить координату Х ");
            X += Convert.ToInt64(Console.ReadLine()); //считываемая строка в формате string по умолчанию не может преобразовываться в число, потому нужна конвертация
            Console.WriteLine("Введите на какое число переместить координату Y ");
            Y += Convert.ToInt64(Console.ReadLine());
        }

        public virtual string type() //вывод состояния объекта
        {
            return(GetType().Name + "\nX = " + X + "\nY = " + Y);
        }
        //геттеры
        public double getX()
        {
            return X;
        }
        public double getY()
       {
           return Y;
       }

    }
    class Triangle : Point //класс треугольник состоящий из точек
    {
        protected Point A;
        protected Point B;
        protected Point C;

        public Triangle()//конструктор без параметров задает по умолчанию все ноли
        {
            A = new Point(0, 0);
            B = new Point(0, 0);
            C = new Point(0, 0);
        }

        public Triangle(Point a, Point b, Point c) //конструктор с параметрами
        {
            A = a;
            B = b;
            C = c;
        }

        public override void move()//переопределенный метод сдвига
        {
            Console.WriteLine("Точка A");
            A.move();
            Console.WriteLine("Точка B");
            B.move();
            Console.WriteLine("Точка C");
            C.move();
        }
     
        public virtual double square()//метод нахождения площади
        {
            return Math.Abs((B.getX() - A.getX()) * (C.getY() - A.getY()) - (C.getX() - A.getX()) * (B.getY()-A.getY())) / 2;
        }
        public virtual double perimeter()//находим периметр
        {
            return Math.Sqrt(Math.Pow(B.getX() - A.getX(), 2) + Math.Pow(B.getY() - A.getY(), 2)) +
                Math.Sqrt(Math.Pow(C.getX() - A.getX(), 2) + Math.Pow(C.getY() - A.getY(), 2)) +
                Math.Sqrt(Math.Pow(C.getX() - B.getX(), 2) + Math.Pow(C.getY() - B.getY(),2 ));
        }
        public override string type()//вывод состояния объекта
        {
            return this.GetType().Name + "\nA = " + A.type() + "\nB = " + B.type() + "\nC = " + C.type();
        }
        public double lenth_base()//функция возвращающая длину основания треугольника, нужна для дальнейшей работы с пирамидой
        {
            return Math.Sqrt(Math.Pow(C.getX() - A.getX(), 2) + Math.Pow(C.getY() - A.getY(), 2));
        }

    }

    class Triangular_puramid : Triangle //класс пирамида, состоящий из треугольников
    {
        private Triangle AA;
        private Triangle BB;
        private Triangle CC;

        public Triangular_puramid(Triangle aa, Triangle bb, Triangle cc)  //конструктор с параметрами
        {
            AA = aa;
            BB = bb;
            CC = cc;
        }

        public override void move()//переопределенный метод сдвига
        {
            Console.WriteLine("Сторона треугольника AA");
            AA.move();
            Console.WriteLine("Сторона треугольника BB");
            BB.move();
            Console.WriteLine("Сторона треугольника CC");
            CC.move();
        }
        public override double square()//переопределенный метод нахождения площади
        {
            return AA.square() + BB.square() + CC.square() + Math.Pow(AA.lenth_base(), 2);
        }
        public override double perimeter()//находим периметр, возвращает значение
        {
            return AA.lenth_base() + BB.lenth_base() + CC.lenth_base();
        }
        public override string type()//переопределнный вывод состояния объекта
        {
            return this.GetType().Name + "\nAA = " + AA.type() + "\nBB = " + BB.type() + "\nCC = " + CC.type();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Point point1 = new Point(1, 2);//создаем обьект точка, используя конструктор с параметрами
            Point point2 = new Point(13, 22);
            Point point3 = new Point(17, 23);
            point1.move();//передвигаем точку
            Console.WriteLine("*********************");
            Console.WriteLine(point1.type());//выводим информацию об объекте
            Console.WriteLine("*********************");
            Triangle triangle1 = new Triangle(point1, point2, point3);//создаем треугольник из 3 точек используя конструктор с параметрами
            Triangle triangle2 = new Triangle(point2, point1, point3);
            Triangle triangle3 = new Triangle(point3, point2, point1);
            triangle1.move();//сдвигаем треугольник
            Console.WriteLine("*********************");
            Console.WriteLine(triangle1.type());//выводим информацию об объекте
            Console.WriteLine("*Площадь треугольника*");
            Console.WriteLine(triangle1.square());
            Console.WriteLine("*Периметр Треугольника*");
            Console.WriteLine(triangle1.perimeter());
            Triangular_puramid puramid = new Triangular_puramid(triangle1, triangle2, triangle3);//создаем пирамиду из 3 треугольников
            Console.WriteLine("*********************");
            puramid.move();//сдвигаем пирамиду
            Console.WriteLine("*********************");
            Console.WriteLine(puramid.type());//выводим информацию об объекте
            Console.WriteLine("***Площадь пирамиды**");
            Console.WriteLine(puramid.square());
            Console.WriteLine("**Периметр пирамиды**");
            Console.WriteLine(puramid.perimeter());
        }
    }
}

Комментарии

Популярные сообщения из этого блога

Прата С. Решение задач 6 главы

На решение этих задач у меня ушло 2 дня. Становится все интереснее и интереснее! и черт возьми, я наконец-то поняла работу с файлами! прошу прощения за корявые условия. просто в нормальном формате электронной книги у меня нет, потому скрины задач просто пропущены через Файнридер.

Прата С. решение задач 5 главы

Эта глава по циклам меня удивила. я  с неким пренебрежением отнеслась к ней, т.к. думала что и так все знаю по этой теме. но Прата так глубоко и в подробностях объяснил тему, что я заново переосмыслила циклы и выражения. было очень много интересных подробностей, которые мне никто не мог толком объяснить. и кстати, парочка задач была над которыми я поломала голову. особенно понравился такой акцент на указателях. как говорится, приучают с малых лет. понять - поняла, но путаюсь в них до сих пор нечеловечески.

Прата С. Решение 3 и 4 главы

Повторюсь, взяла только интересные мне задания, т.е. с элементами того что поняла плохо/не встречала ранее. Сделала за сегодня. с удовольствием отмечаю что сдвиги  в положительную сторону  хотя-бы в стиле есть . в 4 главе ясно объяснено почему при вводе нескольких строк начинаются проблемы, и как этого избежать, подробно описана работа с входным потоком. Как работать со строками стиля Си и класса String, разница. для себя я сделала выводы что лучше всего, конечно-же класс string. намного меньше мороки. и метод ввода getline в обоих случаях. в задачах разница проиллюстрирована. и кстати, указатели больше не вызывают у меня ужаса и трепета. много нового узнала о видах структур. эта глава расставила все по местам в моей голове. правда, зачем в задачи на СР втиснута работа с массивом array - загадка. он ведь толком не объяснен, но понять его интуитивно можно, правда, зачем его использовать не зная тонкостей, как обычный массив с немного иным объявле...