Высокоуровневые методы информатики и...
description
Transcript of Высокоуровневые методы информатики и...
![Page 1: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/1.jpg)
Высокоуровневые методы информатики и
программирования
Лекция 11-12
Наследование классов
![Page 2: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/2.jpg)
План лекции
• Связи между классами• Агрегация классов• Наследование классов• Скрытие методов• Переопределение методов
![Page 3: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/3.jpg)
Связи между классами
![Page 4: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/4.jpg)
Связь классов программы
• Часто классы программы связаны между собой
• Два типа связи– агрегирование (ассоциация, has-a) - класс содержит
объекты другого класса;– наследование (is-a) - один класс может быть производным
от другого класса – наследовать его поля, свойство, методы
• Множество классов описывающих решаемую задачу называются - модель предметной области
![Page 5: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/5.jpg)
Взаимозависимости классов в UML
Типы взаимозависимостей (relationship)• зависимость (dependency) – один класс временно
использует (или знает) о другом классе, самая слабая, временная связь;
• ассоциация (association) – один класс использует объекты другого класса (has a)
• агрегирование (aggregation) – более сильная ассоциация между классами (owns a)
• композиция (composition) – очень сильная взаимосвязь между классами, отношение «часть-целое» (part-of)
• обобщение (generalization) отношение наследования (“являться”, “is a”)
![Page 6: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/6.jpg)
UML обозначения
1. зависимость (dependency)
2. ассоциация (association)
3. агрегирование (aggregation)
4. композиция (composition)
5. наследование, обобщение (generalization)
![Page 7: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/7.jpg)
Наследование• Один класс может быть производным от другого
класса (базового).• Класс может быть наследником только одного
базового класса• Производный класс может использовать поля,
свойства и методы базового класса (и классов для которых он является производным).
• Все классы наследуются от базового класса System.Object, который содержит – конструктор по умолчанию new()– ToString();– GetType();– GetHashCode();– Equals().
![Page 8: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/8.jpg)
Universal Modeling Language диаграмма
Базовый класс(Родительский класс)
Производный класс(дочерний класс)
• Universal Modeling Language (UML) язык для моделирования программ (программных систем).
• UML включает набор диаграмм для описания проектируемых программ.
• В UML есть диаграмма классов.
![Page 9: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/9.jpg)
Наследование
Manager "IS A" Human Programmer "IS A"
Human
ManagerTraineeSeniorManager
ProgrammerManager
Human
![Page 10: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/10.jpg)
Наследование типов в CLR
Object
String Array ValueType Exception Delegate Class1
Class2
Class3
MulticastDelegate
Structure1Enum
Enum1
Встроенные типы
Boolean Char
Byte
Int16
Int32
Int64
Single
Double
Decimal
DateTime
- Типы, описанные в системе
- Типы, описанные разработчиками
![Page 11: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/11.jpg)
Иерархия классов элементов управления
Control
ButtonBase
Button CheckBox RadioButton
Label
LinkLabel
TreeView
![Page 12: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/12.jpg)
Происхождение класса форм Form
Control
ScrollableControl
ContainerControl
Form
Object
. . .
![Page 13: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/13.jpg)
Правило наследованияДва класса, которые могут быть связаны с
помощью отношения наследования должны пройти тест “является видом …” ("is a" test.)
Например: • Треугольник является видом фигуры• Руководитель является видом служащего• Легковой автомобиль является видом
транспортного средстваНапример нельзя наследовать: велосипед не является видом колеса
![Page 14: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/14.jpg)
Методы класса System.Object• Equals() - виртуальный метод, возвращающий true
если значения объектов совпадают (по умолчанию, если два объекта расположены в одном месте памяти).
• GetHashCode() - виртуальный метод, возвращает некоторое целое число (хэш-код), однозначно идентифицирующее экземпляр класса.
• GetType() - возвращает объект типа Type, описывающий соответствующий тип.
• ToString() - виртуальный метод, возвращающий символьное представление значения переменной (по умолчанию возвращает строку, представляющую полное имя типа объекта).
![Page 15: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/15.jpg)
• Equals() – по умолчанию этот метод возвращает true только в том случае, если сравниваемые элементы ссылаются на один и тот же объект в оперативной памяти. Таким образом, Equals() используется для сравнения ссылок на объект, а не состояния объекта. Обычно этот метод переопределяется (overridden) для возврата true в том случае, если сравниваемые объекты имеют одинаковые значения полей (internal state values). При переопределении Equals() также нужно переопределить метод GetHashCode(), так как он используется типом Hashtable для поиска объектов в коллекциях.
• GetHashCode() – этот метод возвращает целое число, которое идентифицирует конкретный экземпляр объекта класса.
• GetType() – этот метод возвращает объект типа Type, который полностью описывает объект, на который выполняется ссылка. Это метод динамической идентификации типа объекта (Runtime Type Identification, RTTI), который доступен для всех объектов.
• ToString() – этот метод возвращает текстовое описание объекта, используя формат <namespace>.<type name> (называемое fully qualified name). Данный метод может быть переопределен в производном классе для возвращения строки с парами им/значения для описания внутреннего состояния объекта.
![Page 16: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/16.jpg)
Хэш-код• Хэш-функция (функция свёртки) ― это функция, отображающая
аргумент произвольной конечной длины в образ фиксированной длины.
• Результат работы данной функции называют хэш-кодом, хэшем или дайджестом сообщения (англ. message digest).
• Если хэш-функция зависит от секретного ключа, то она называется ключевой, в противном случае бесключевой.
• Простым примером хеширования может служить нахождение контрольной суммы сообщения: сумма кодов всех входящих в него символов, от которой берётся несколько последних цифр. Полученное число является примером хэш-кода исходного сообщения.
![Page 17: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/17.jpg)
Описание производного класса
public class <new class> : <base class> {…}• Наследование может быть только от одного класса
• Примерpublic class ColorPoint : Point{…}
![Page 18: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/18.jpg)
Объект производного класса имеет доступ ко всем
• Открытым (public) свойствам и методам базового класса
• Защищенным (protected) свойствам и методам базового класса
• Методам переопределенным (override) в производном классе
• Свойствам и методам скрытым (new) в производном классе
• Любым свойствам и методам производного класса
![Page 19: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/19.jpg)
Изолированные классы• Можно создать класс, у которого не должны быть производные классы. • Для этого используется ключевое слово sealed, которое сообщает
компилятору, что для описываемого класса нельзя создавать наследников.• Например, вы решили, что нет смысла делать наследников от класса
MiniVan:
// Данный класс нельзя наследовать!sealed class MiniVan : Car{}
• Если вы попытаетесь сделать класс производный от MiniVan то получите сообщение об ошибке:
// Error! Cannot extend a class marked with the sealed keyword!class DeluxeMiniVan: MiniVan{ … }
![Page 20: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/20.jpg)
• В библиотеке FCL описано большое количество закрытых классов:
![Page 21: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/21.jpg)
Диаграммы классов
• Добавление диаграммы классов к проекту:
![Page 22: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/22.jpg)
Наследование
public Manager(string fullName, int age, int empID, float currPay, string ssn, int numbOfOpts) : base(fullName, age, empID, currPay, ssn){// This field is defined by the Manager class. numberOfOptions = numbOfOpts;}
![Page 23: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/23.jpg)
Сохранение семейных секретов:режим доступа protected
• Режим доступа: protected• К элементам класса с режимом доступа
protected имеется доступ в методах самого класса и методах производных классов.
![Page 24: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/24.jpg)
Диаграмма наследования
Методы Свойства Поля
Новые Наследуемые от АМетоды Свойства Поля Методы Свойства Поля
Новые Наследуемые от B Наследуемые от АМетоды Свойства Поля Методы Свойства Поля Методы Свойства Поля
ClassA
ClassB
ClassC
Элементы класса С
class ClassAclass ClassB : ClassAclass ClassC : ClassB
Все методы, свойства и поля - public и protected
![Page 25: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/25.jpg)
Конструктор производного класса
• Конструктор производного класса может вызывать на выполнение требуемый конструктор базового класса.
рublic Circle (int a, int b, int r) : base(a, b){
base._x = 0; // обращение в переменной // базового класса
}
![Page 26: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/26.jpg)
Операция присвоения
T1 e = new T1(); T2 x;x = e
• Присваивание допустимо, если и только если имеет место согласование типов. • Определение: тип T1(для e) согласован по присваиванию с базовым типом T (для x), если они совпадают или если класс T1 является потомком класса T.
![Page 27: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/27.jpg)
Правило присвоения ссылочных переменных
• Нельзя присвоить переменную одного класса переменной другого классаCar a = new Car;Book b = new Book;a = b; //Value of type ‘Book' cannot be converted to ‘Car'
• Можно присвоить переменной базового класса значение переменной производного класса MyBaseClass a = new MyBaseClass; MyNewClass b = new MyNewClass; // производный от MyBaseClass
a = b; //Value of type ' MyNewClass' can be converted to ' MyBaseClass‘
b = a; //Value of type ' MyBaseClass ' cannot be converted to ' MyNewClass‘
Debug сообщения:– An unhandled exception of type 'System.InvalidCastException' occurred in Xxxxx.exe– Additional information: Specified cast is not valid.
![Page 28: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/28.jpg)
Тип объекта и тип ссылки • Следует всегда различать
– тип объекта (type of object) который используется – тип ссылки (type of reference) с помощью которой
взаимодействуют с объектом.
ClassA a; // тип ссылки ClassA(базовый)a = new ClassB; // тип объекта ClassB (производный)
• Статическое и динамическое связывание
ссылочная переменная
Объект
![Page 29: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/29.jpg)
Изменение методов в производном классе
Если в производном классе есть метод с именем и сигнатурой идентичной методу базового класса, то он может:• скрывать (shadowing) метод базового класса, т.е. работать только с использованием ссылки производного типа• заменять (переопределять, overriding) метод базового класса, т.е. работать с ссылками и производного и базового типа
![Page 30: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/30.jpg)
Скрытие метода базового класса
public class A {
public void Print ( ) // может быть и virtual {
Console.WriteLine("Class A"); }
}
public class B : A{
public new void Print ( ) {
Console.WriteLine("Class B"); }
}
….
A a;
B b = new B( );
b.Print( ); // "Class B"
a = b;
a. Print( ); // "Class A"
….
![Page 31: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/31.jpg)
Замена метода базового классаpublic class A {
public virtual void Print ( ) {
Console.WriteLine("Class A"); }
}
public class B : A{
public override void Print ( ) {
Console.WriteLine("Class B"); }
}
….
A a;
B b = new B( );
b.Print( ); // "Class B"
a = b;
a.Print( ); // "Class B"
…
![Page 32: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/32.jpg)
Изолированные методыpublic override sealed void TraceSelf( ) {...}
![Page 33: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/33.jpg)
Пример
• Figure• Rectangle • Triangle• Point
![Page 34: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/34.jpg)
Базовый класс
class MyBaseClass {private int v;public int Val {…}
. . . public int fn(…) {…}. . .
}. . .MyBaseClass a = new MyBaseClass;n = a.fn();MyBaseClass b;b = a
v
MyClass
Valfn
24386
24386
24386Nothing
![Page 35: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/35.jpg)
Производный класс – скрытие функции
class MyNewClass : MyBaseClass {private int v1;рublic int Val1 {…}
. . . public new int fn(…) { … }. . .
}. . .MyNewClass a = new MyNewClass;n = a.fn(); // функция нового класса. . .MyBaseClass b; b = a;n = b.fn(); // функция базового класса
MyNewClass
Val1fn
24386 vv1
v
24386
Ссылка на производный класс
Ссылка на базовый класс
MyBaseClass
Valfn
Вызываемая функция определяется типом ссылки
![Page 36: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/36.jpg)
Производный класс – переопределение функции
class MyBaseClass {. . .
public virtual int fn(…) {…}. . .
} class MyNewClass : MyBaseClass {
. . . public override int fn(…) { … }. . .
}
MyNewClass a = new MyNewClass;n = a.fn(); // функция нового класса
MyBaseClass b; b = a;n = b.fn(); // функция базового класса
MyNewClass
Val1fn
24386 vv1
v
24386
Ссылка на производный класс
Ссылка на базовый класс
MyBaseClass
Valfn
Вызываемая функция определяется типом объекта
vtb vtb
![Page 37: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/37.jpg)
Полиморфизм (Polymorphism )
• Множество объектов может внешне выглядеть одинаково, но выполнять методы они могут по разному
• С объектами производных классов можно работать, как с объектами базового класса
• Используя полиморфизм можно создавать общие алгоритмы для любых объектов производных от базового класса
![Page 38: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/38.jpg)
Наследование
• Базовый класс (Base Class)– Person
• Производные классы (Subclasses)– Employee– Customer– Student
Person-Name-Address-Phone Salary()
Seller
Salary()
Worker
Salary()
Engineer
Salary()
![Page 39: Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов](https://reader035.fdocuments.net/reader035/viewer/2022062222/56816380550346895dd461e4/html5/thumbnails/39.jpg)
Полиморфизм
• Массив Persons Person[] Company = new Person[200];Seller Ivan = new Seller();Engineer Petr = new Engineer();Company[0] = Ivan;Company[1] = Petr;decimal s = 0;
foreach (Person p in Company)s += p.Salary();