Справочник от Автор24
Поделись лекцией за скидку на Автор24

Иерархия

  • 👀 234 просмотра
  • 📌 201 загрузка
Выбери формат для чтения
Загружаем конспект в формате pptx
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Конспект лекции по дисциплине «Иерархия» pptx
Иерархия Иерархия Иерархия - это упорядочение абстракций, расположение их по уровням. Основными видами иерархических структур применительно к сложным системам являются: структура классов (иерархия "is-a") структура объектов (иерархия "part of"). Виды иерархии Отношение "part of" (часть) вводит иерархию агрегации. Агрегация описывает отношения целого и части, приводящие к соответствующей иерархии объектов, причем, идя от целого (агрегата), мы можем придти к его частям (атрибутам). Виды иерархии Виды иерархии “part of”:  Композиция  Агрегация  Вложение Композиция При отношении композиции объекты одного класса или нескольких разных классов входят как поля в объект другого (включающего) класса. Таким образом включенные объекты не существуют без включающего их объекта. Композиция Композиция Определим класс «точка на плоскости»: class Point { double x, у; public double X { get { return x; } set { x = value; } } public double Y { get { return y; } set { у = value; } } } Композиция class Circle { // Закры ты е поля: double rad; // Радиус окружности Point centre = new Point(); // Центр окружности // Свойство для радиуса окружности: public double Rad { get { return rad; } set { rad = value; }} // Свойство для получения значения длины окружности: public double Len { get { return 2*rad*Math.PI; } } // Свойство для центра окружности: public point Centre { get { return centre; } set { centre = value; } } public void display() { Console.WriteLine(" Centre: X = {0}, Y= {1}; Radius = {2}, " + " Length = {3, 6:f2}" , centre.X, centre.Y, this.rad, Len); } } Композиция static void Main() { Circle rim = new Circled; rim.Centre.X = 10; rim. Centre. Y = 20; rim.Rad = 3.0; rim.display(); } Результат выполнения программы: Centre: X= 10, Y = 20; Radius = 3, Length = 18,85 Композиция Основное, на что следует обратить внимание, — в программе нет отдельно существующего объекта класса Point. Именно это является основным признаком композиции классов. Объект класса Point явно создается только при создании объекта класса Circle. Агрегация При отношении агрегации объект одного класса объединяет уже существующие объекты других классов, т.е. и включающий объект, и включаемые в него объекты существуют в некотором смысле самостоятельно. При уничтожении включающего объекта входившие в него объекты сохраняются. Агрегация Агрегация class Circle { // Закры ты е поля: double rad; // Радиус окружности Point centre; // Ссы лка без инициализации public Circle(Point р, double rd) // Конструктор { centre = р; rad = rd; } public double Rad { ... } public double Len { ... ) public point Centre { ... } public void display() { ... } ) Агрегация static void Main() { Point pt = new Point(); pt.X = 10; pt.Y = 20; Circle rim = new Circle(pt, 10); rim. display(); } Результат выполнения программы: Centre: X=10,Y = 20; Radius = 10, Length = 62,83 Агрегация В отличие от композиции при агрегации в классе Circle нет явной инициализации поля centre. Для обеспечения включения объекта класса Point в объект класса Circle в классе Circle явно определен конструктор, одним из параметров которого служит ссылка на объект класса Point. В теле конструктора значение этой ссылки присваивается полю centre класса Circle. Вложение классов В объявление класса в качестве его члена может войти объявление типа. Таким типом может быть класс. Этот внутренний класс называют вложенны м классом, а включающий его класс — внешним. Особенностью вложенного класса является то, что ему доступны все члены внешнего класса, даже если эти члены закрытые (private). Обычно вложенный класс вводится только для выполнения действий внутри внешнего класса и "не виден" вне включающего его класса. Однако вложенный класс может быть объявлен с модификатором public, и тогда он становится, доступен везде, где виден внешний класс. Вложение классов using System; class Circle { // Закры ты е поля: double rad; // Радиус окружности Point centre - new Point(); // Центр окружности // Свойство для радиуса окружности: public double Rad { get { return rad; } set { rad = value; } } // Свойство для получения значения длины окружности: public double Len { get { return 2 * rad * Math. PI; } } // Свойство для центра окружности: public Point Centre { get { return centre; } set { centre - value; } } public void display() { Console.WriteLine(" Centre:X = {0}, Y= {1};" + " Radius - {2}, Length = {3,6:f2}" , centre.X, centre.Y, this.rad, Len); } Вложение классов public class Point { double x, y; public double X { get { return x;} set { x = value; } } public double Y { get { return y; } set { у = value; } } } // end of Point } // end of Circle Вложение классов class Program { static void Main() { Circle rim = new Circle(); rim.Centre.X= 100; rim.Centre. Y = 200; rim.Rad = 30.0; rim.display(); } } Результат выполнения программы: Centre: X= 100, Y = 200; Radius = 30, Length = 188,50 Вложение классов В классе Circle для инициализации поля center использу­ ется конструктор умолчания класса Point. Префикс «Circle.» при этом не требуется применять, хотя его использование не приведет к ошибке. То же самое относится и к обозначению типа свойства Centre. Нет явного определения конструкторов и во внешнем классе. Поэтому в методе Main() для создания объекта, ассоциированного со ссылкой rim, используется конструктор умолчания Circle(). Для обращения к свойствам, определяющим центр окружности, потребовалось использовать имена с двойной квалификацией: rim.Centre.X и rim.Centre.Y. В отличие от композиции и агрегации при вложении классов внутренний класс (не только объект) не существует независимо от внешнего. Виды иерархии Важным элементом объектно-ориентированных систем и основным видом иерархии "is-a" является концепция наследования. Наследование означает такое отношение между классами (отношение родитель/потомок), когда один класс заимствует структурную или функциональную часть одного или нескольких других классов (соответственно, одиночное и множественное наследование). Наследование Наследование В языке С# класс, который наследуется, называется базовы м, а класс, который наследует, — производны м. Следовательно, производный класс представляет собой специализированный вариант базового класса. Он наследует все переменные, методы, свойства и индексаторы, определяемые в базовом классе, добавляя к ним свои собственные элементы. Наследование Для объявления класса, который является наследником некоторого базового класса, используется следующий синтаксис: [модификаторы ] class имя_производного_класса :имя_базового_класса {операторы _тела_производного_класса} Конструкция :имя_базового_класса в стандарте С# называется спецификацией базы класса. Доступность членов класса при наследовании Члены базового класса, имеющие статус доступа private остаются закрытыми для производного класса. Члены базового класса, имеющие модификатор public, открыты для членов и объектов производного класса. В ряде случаев необходимо, чтобы члены базового класса были доступны (открыты) для членов производного класса, но в то же время были закрыты (недоступны) для объектов про­ изводного класса. В этом случае в базовом классе эти члены должны быть защищенны ми, т.е. объявлены с модификатором protected. class person { protected string fam; protected DateTime rogd; protected char pol; protected int vozr; ... } class stud : person { string grup; string vid; ... } Доступность членов класса при наследовании В производном классе обычно вводятся новые члены, определяющие новое поведение и дополнительные характеристики объектов производного класса. Для новых (не унаследованных) членов производных классов имена выбираются произвольно. Если в производном классе объявлен член, имя которого совпадает с именем какого-либо члена базового класса, то для их различения в производном классе используются уточненные имена: this. имя_члена_производного_класса base.имя_члена_базового_класса При внешних обращениях одноименные члены базового и производного класса различаются по типам объектов, для которых эти обращения выполнены. Методы при наследовании Правила работы с конструкторами: 1.Если в определении класса присутствует объявление хотя бы одного конструктора, то конструктор без параметров автоматически в класс не добавляется. 2. В отличие от других членов базового класса, конструкторы не наследуются. Конструктор базового класса необходимо явно вызвать из инициализатора конструктора производного класса. Если этого не сделано, то компилятор по умолчанию самостоятельно дополнит объявление конструктора (точнее его инициализатор) обращением к конструктору базового класса без параметров. public person() {vozr=20; } public person(string fio, DateTime rogd, char pol) { this.fio = fio; this.pol=pol; this.rogd = rogd; let(); } Методы при наследовании public stud():base() { grup = "Группа"; vid = ""; } public stud(string fam, DateTime rogd, char pol, string grup, string vid): base( fam, rogd, pol) { this.grup = grup; this.vid = vid; } Методы при наследовании Поведение одноименных методов базового и производного классов. 1.Для методов возможна перегрузка (overload). В этом случае одноименные методы базового и производного классов должны иметь разные спецификации параметров. 2.Разрешено переопределение, иначе экранирование или сокрытие (hiding), методом производного класса одноименного метода базового класса (спецификации параметров совпадают). 3.Метод базового класса может быть объявлен как виртуальный (virtual), и тогда при его переопределении (overriding) в производных классах обеспечивается полиморфизм. Методы при наследовании В случае перегрузки методов при наследовании никаких нововведений нет. При экранировании метода стандарт рекомендует снабжать метод производного класса модификатором new. При его отсутствии компиляция проходит успешно, но выдается предупреждение (Warning). В нем программисту указывают, что он выполнил переопределение метода базового класса, возможно, по оплошности. Если при переопределении методов необходимо из методов производного класса обращаться к методу базового класса, то используется уточненное имя base.имя_метода_базового_класса. Методы при наследовании class Figure // Базовы й класс { protected double dx, dy; // Размеры вдоль осей public void print() { Console.WriteLine(" Габариты : dx = {0:f2}, dy = {1:f2}" ,dx,dy);} } //Производны й класс - прямоугольник: class Rectangle: Figure { public Rectangle(double xi, double yi) { dx = xi; dy = yi; } public new void print() { Console. Write(" Прямоугольник! \t" ); base.print(); } } //Производны й класс - треугольник: class Triangle: Figure { public Triangle(double xi, double yi) { dx = xi; dy = yi; } public new void print() { Console. Write(" Tpeyгольник!\t" ); base.print(); } } Методы при наследовании class Program { static void Main() { Rectangle rec = new Rectangle(3.0, 4.0); rec.print(); Triangle tre = new Triangle(5.0, 4.0); tre.print(); Figure fig = new Figure(); fig.print(); } } Результат выполнения программы: Прямоугольник! Габариты : dx = 3,00, dy = 4,00 Треугольник! Габариты : dx - 5,00, dy = 4,00 Габариты : dx = 0,0, dy = 0,0 Виртуальны е методы и полиморфизм Ссылке с типом базового класса можно присвоить значение ссылки на объект производного класса. После такого присваивания ссылка не обеспечивает доступа к обычным (не виртуальным) методам производного класса. Виртуальны е методы и полиморфизм static void Main() { Figure fig1 = new Rectangle(3.0, 4.0); Figure fig2 = new Triangle(5.0, 4.0); Figure fig3 = new Figure(); fig1.print(); fig2.print(); fig3.print(); } } Виртуальны е методы и полиморфизм Результат выполнения программы: Габариты : dx = 3,00, dy = 4,00 Габариты : dx = 5,00, dy = 4,00 Габариты : dx = 0,00, dy = 0,00 Адресаты обращений в выражениях figl.print(), fig2.print(), fig3.print() определяются объявленным типом ссылок, а не типом значения, которое ассоциировано со ссылкой «присвоено». Связано это с невиртуальностью методов print(). Виртуальны е методы и полиморфизм Ссылка с типом базового класса может обеспечить доступ к виртуальному методу того производного класса, объект которого в этот момент адресован этой ссылкой. Для опреде­ления в базовом классе виртуального метода в его заголовок нужно добавить модификатор virtual. В производном классе для переопределения виртуального метода используется модифика­тор override. Заметим, что виртуальный метод не может быть закрытым (private). Виртуальны е методы и полиморфизм class Figure // Базовы й класс { protected double dx, dy; // Размеры вдоль осей public virtual void print() { Console.WriteLine(" Габариты : dx = {0:f2}, dy = {1:f2}" ,dx,dy);} } //Производны й класс - прямоугольник: class Rectangle: Figure { public Rectangle(double xi, double yi) { dx = xi; dy = yi; } public override void print() { Console. Write(" Прямоугольник! \t" ); base.print(); } } //Производны й класс - треугольник: class Triangle: Figure { public Triangle(double xi, double yi) { dx = xi; dy = yi; } public override void print(){ Console. Write(" Tpeyгольник!\t" ); base.print(); } } Виртуальны е методы и полиморфизм Результат выполнения того же фрагмента кода с определе­нием и использованием ссылок figl, fig2, fig3 будет таким: Прямоугольник! Габариты : dx = 3,00, dy = 4,00 Треугольник! Габариты : dx - 5,00, dy = 4,00 Габариты : dx = 0,00, dy = 0,00 Виртуальны е методы и полиморфизм Массивы ссылок с типом базового класса позволяют продемонстрировать возможности виртуальных методов и свойств. Как уже показано, ссылке с типом базового класса можно присвоить значение ссылки на объект любого производного класса. Если в производных классах переопределены виртуальные методы базового класса, то с помощью одной ссылки с типом базового класса можно обращаться к методам объектов разны х производных классов. Виртуальны е методы и полиморфизм using System; class A { public virtual string record() { return " Базовы й класс!" ; } } class В : A { public override string record() { return " Производны й В!" ; } } class С : А { public override string record() { return " Производны й С!" ; } } Виртуальны е методы и полиморфизм class Program { static void Main() { A[ ] arrA = new A[] {new A(), new B(), new C(), new B()}; foreach (A rec in arrA) Console. WriteLine(rec. record()); } } Виртуальны е методы и полиморфизм Результат выполнения программы: Базовы й класс! Производны й В! Производны й С! Производны й В! Виртуальны е методы и полиморфизм О возможности ссылки с типом базового класса представлять виртуальные члены производных классов говорят, используя термин «динамическое связы вание». Эта возможность основана на наличии у ссылки двух типов. Тип, получаемый в декларации ссылкой на объекты базового класса, является ее объявленны м (статическим) типом. Если этой ссылке присваивается значение ссылки на объект производного класса, то ссылка дополнительно получает тип времени исполнения (динамический тип). При обращении к невиртуальным членам учитывается статический тип ссылки, что обеспечивает доступ к членам базового класса. При обращении к виртуальным членам используется динамический тип ссылки и вызываются члены объекта производного класса.
«Иерархия» 👇
Готовые курсовые работы и рефераты
Купить от 250 ₽
Решение задач от ИИ за 2 минуты
Решить задачу
Найди решение своей задачи среди 1 000 000 ответов
Найти
Найди решение своей задачи среди 1 000 000 ответов
Крупнейшая русскоязычная библиотека студенческих решенных задач

Тебе могут подойти лекции

Автор(ы) Гвоздкова Ирина Александровна
Смотреть все 588 лекций
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot