Высокоуровневые методы информатики и...

39
Высокоуровневые методы информатики и программирования Лекция 11-12 Наследование классов

description

Высокоуровневые методы информатики и программирования Лекция 1 1 - 12 Наследование классов. План лекции. Связи между классами Агрегация классов Наследование классов Скрытие методов Переопределение методов. Связи между классами. Связь классов программы. - PowerPoint PPT Presentation

Transcript of Высокоуровневые методы информатики и...

Page 1: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Высокоуровневые методы информатики и

программирования

Лекция 11-12

Наследование классов

Page 2: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

План лекции

• Связи между классами• Агрегация классов• Наследование классов• Скрытие методов• Переопределение методов

Page 3: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Связи между классами

Page 4: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Связь классов программы

• Часто классы программы связаны между собой

• Два типа связи– агрегирование (ассоциация, has-a) - класс содержит

объекты другого класса;– наследование (is-a) - один класс может быть производным

от другого класса – наследовать его поля, свойство, методы

• Множество классов описывающих решаемую задачу называются - модель предметной области

Page 5: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Взаимозависимости классов в UML

Типы взаимозависимостей (relationship)• зависимость (dependency) – один класс временно

использует (или знает) о другом классе, самая слабая, временная связь;

• ассоциация (association) – один класс использует объекты другого класса (has a)

• агрегирование (aggregation) – более сильная ассоциация между классами (owns a)

• композиция (composition) – очень сильная взаимосвязь между классами, отношение «часть-целое» (part-of)

• обобщение (generalization) отношение наследования (“являться”, “is a”)

Page 6: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

UML обозначения

1. зависимость (dependency)

2. ассоциация (association)

3. агрегирование (aggregation)

4. композиция (composition)

5. наследование, обобщение (generalization)

Page 7: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Наследование• Один класс может быть производным от другого

класса (базового).• Класс может быть наследником только одного

базового класса• Производный класс может использовать поля,

свойства и методы базового класса (и классов для которых он является производным).

• Все классы наследуются от базового класса System.Object, который содержит – конструктор по умолчанию new()– ToString();– GetType();– GetHashCode();– Equals().

Page 8: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Universal Modeling Language диаграмма

Базовый класс(Родительский класс)

Производный класс(дочерний класс)

• Universal Modeling Language (UML) язык для моделирования программ (программных систем).

• UML включает набор диаграмм для описания проектируемых программ.

• В UML есть диаграмма классов.

Page 9: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Наследование

Manager "IS A" Human Programmer "IS A"

Human

ManagerTraineeSeniorManager

ProgrammerManager

Human

Page 10: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Наследование типов в 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 Наследование классов

Иерархия классов элементов управления

Control

ButtonBase

Button CheckBox RadioButton

Label

LinkLabel

TreeView

Page 12: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Происхождение класса форм Form

Control

ScrollableControl

ContainerControl

Form

Object

. . .

Page 13: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Правило наследованияДва класса, которые могут быть связаны с

помощью отношения наследования должны пройти тест “является видом …” ("is a" test.)

Например: • Треугольник является видом фигуры• Руководитель является видом служащего• Легковой автомобиль является видом

транспортного средстваНапример нельзя наследовать: велосипед не является видом колеса

Page 14: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Методы класса System.Object• Equals() - виртуальный метод, возвращающий true

если значения объектов совпадают (по умолчанию, если два объекта расположены в одном месте памяти).

• GetHashCode() - виртуальный метод, возвращает некоторое целое число (хэш-код), однозначно идентифицирующее экземпляр класса.

• GetType() - возвращает объект типа Type, описывающий соответствующий тип.

• ToString() - виртуальный метод, возвращающий символьное представление значения переменной (по умолчанию возвращает строку, представляющую полное имя типа объекта).

Page 15: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

• 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 Наследование классов

Хэш-код• Хэш-функция (функция свёртки) ― это функция, отображающая

аргумент произвольной конечной длины в образ фиксированной длины.

• Результат работы данной функции называют хэш-кодом, хэшем или дайджестом сообщения (англ. message digest).

• Если хэш-функция зависит от секретного ключа, то она называется ключевой, в противном случае бесключевой.

• Простым примером хеширования может служить нахождение контрольной суммы сообщения: сумма кодов всех входящих в него символов, от которой берётся несколько последних цифр. Полученное число является примером хэш-кода исходного сообщения.

Page 17: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Описание производного класса

public class <new class> : <base class> {…}• Наследование может быть только от одного класса

• Примерpublic class ColorPoint : Point{…}

Page 18: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Объект производного класса имеет доступ ко всем

• Открытым (public) свойствам и методам базового класса

• Защищенным (protected) свойствам и методам базового класса

• Методам переопределенным (override) в производном классе

• Свойствам и методам скрытым (new) в производном классе

• Любым свойствам и методам производного класса

Page 19: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Изолированные классы• Можно создать класс, у которого не должны быть производные классы. • Для этого используется ключевое слово 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 Наследование классов

• В библиотеке FCL описано большое количество закрытых классов:

Page 21: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Диаграммы классов

• Добавление диаграммы классов к проекту:

Page 22: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Наследование

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 Наследование классов

Сохранение семейных секретов:режим доступа protected

• Режим доступа: protected• К элементам класса с режимом доступа

protected имеется доступ в методах самого класса и методах производных классов.

Page 24: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Диаграмма наследования

Методы Свойства Поля

Новые Наследуемые от АМетоды Свойства Поля Методы Свойства Поля

Новые Наследуемые от B Наследуемые от АМетоды Свойства Поля Методы Свойства Поля Методы Свойства Поля

ClassA

ClassB

ClassC

Элементы класса С

class ClassAclass ClassB : ClassAclass ClassC : ClassB

Все методы, свойства и поля - public и protected

Page 25: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Конструктор производного класса

• Конструктор производного класса может вызывать на выполнение требуемый конструктор базового класса.

рublic Circle (int a, int b, int r) : base(a, b){

base._x = 0; // обращение в переменной // базового класса

}

Page 26: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Операция присвоения

T1 e = new T1(); T2 x;x = e

• Присваивание допустимо, если и только если имеет место согласование типов. • Определение: тип T1(для e) согласован по присваиванию с базовым типом T (для x), если они совпадают или если класс T1 является потомком класса T.

Page 27: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Правило присвоения ссылочных переменных

• Нельзя присвоить переменную одного класса переменной другого класса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 Наследование классов

Тип объекта и тип ссылки • Следует всегда различать

– тип объекта (type of object) который используется – тип ссылки (type of reference) с помощью которой

взаимодействуют с объектом.

ClassA a; // тип ссылки ClassA(базовый)a = new ClassB; // тип объекта ClassB (производный)

• Статическое и динамическое связывание

ссылочная переменная

Объект

Page 29: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Изменение методов в производном классе

Если в производном классе есть метод с именем и сигнатурой идентичной методу базового класса, то он может:• скрывать (shadowing) метод базового класса, т.е. работать только с использованием ссылки производного типа• заменять (переопределять, overriding) метод базового класса, т.е. работать с ссылками и производного и базового типа

Page 30: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Скрытие метода базового класса

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 Наследование классов

Замена метода базового класса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 Наследование классов

Изолированные методыpublic override sealed void TraceSelf( ) {...}

Page 33: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Пример

• Figure• Rectangle • Triangle• Point

Page 34: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Базовый класс

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 Наследование классов

Производный класс – скрытие функции

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 Наследование классов

Производный класс – переопределение функции

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 Наследование классов

Полиморфизм (Polymorphism )

• Множество объектов может внешне выглядеть одинаково, но выполнять методы они могут по разному

• С объектами производных классов можно работать, как с объектами базового класса

• Используя полиморфизм можно создавать общие алгоритмы для любых объектов производных от базового класса

Page 38: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Наследование

• Базовый класс (Base Class)– Person

• Производные классы (Subclasses)– Employee– Customer– Student

Person-Name-Address-Phone Salary()

Seller

Salary()

Worker

Salary()

Engineer

Salary()

Page 39: Высокоуровневые методы информатики и программирования Лекция  1 1 - 12 Наследование классов

Полиморфизм

• Массив 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();