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

Наследование, индексаторы, полиморфизм, 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());
        }
    }
}

Комментарии

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

ВОПРОС К ЧИТАТЕЛЯМ

Уважаемые читатели моего блога и просто проходящие мимо! У меня появилась идея заняться созданием уроков по интересующим вас темам. Предпочтительно на C++, но не ограничиваясь ими, я хочу поделиться своими знаниями не только в виде готового кода но и подробными объяснениями что к чему. Прошу вас, если вы имеете идею и хотели бы разобраться в какой-то теме - отпишитесь в комментариях, что было бы вам интересно. Постараюсь помочь. 

7 глава, Лафоре Р

*1. Напишите функцию reversit(), которая переворачивает строку (массив типа char). Используйте цикл for, который меняет местами первый и последний символы, затем следующие и т. д. до предпоследнего. Строка должна пере- даваться в функцию reversit() как аргумент. Напишите программу для выполнения функции reversit(). Программа долж- на принимать строку от пользователя, вызывать функцию reversit(), а за- тем выводить полученный результат. Используйте метод ввода, который позволяет использовать внутренние пробелы. Протестируйте программу на примере фразы «Аргентина манит негра».

6 глава, Лафоре Р

*1. Создайте класс Int, имитирующий стандартный тип int. Единственное поле этого класса должно иметь тип int. Создайте методы, которые будут устанавливать значение поля, равным нулю, инициализировать его целым значением, выводить значение поля на экран и складывать два значения типа Int. Напишите программу, в которой будут созданы три объекта класса Int, два из которых будут инициализированы. Сложите два инициализирован- ных объекта, присвойте результат третьему, а затем отобразите результат на экране.