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

Презентация:



Advertisements
Похожие презентации
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
Advertisements

Полиморфизм. Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
С# и ООП Формальное определение класса с C# Класс в C# - это пользовательский тип данных (user defined type), который состоит из данных (часто называемых.
1 ©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
Высокоуровневые методы информатики и программирования Лекция 14 Интерфейсы.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Учебный курс Объектно-ориентированный анализ и программирование Лекция 7 Методы как средство реализации операций Лекции читает кандидат технических наук.
Кафедра ОСУ, Java 2004 Слайд 1 Наследование Наследование позволяет использовать существующий класс для определения новых классов, т.е. способствует.
8. Моделирование логической структуры системы Диаграмма классов Диаграмма классов служит для моделирования классов и отношений между ними.
Классы в С#. Перечисления С# Перечисление задает конечное множество возможных значений, которые могут получать объекты класса перечисление. [атрибуты][модификаторы]
Наследование Полиморфизм ВЫЗОВ КОНСТРУКТОРОВ И ДЕСТРУКТОРОВ ПРИ НАСЛЕДОВАНИИ.
ПОЛИМОРФИЗМ Лекция 3 1. π ολυμορφισμός 2 Полиморфизм кристаллов – углерод: графит, алмаз. Гендерный полиморфизм – человек: мужчина, женщина. Полиморфизм.
Наследование. Наследование – это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся.
Диаграммы UML Диаграмма классов (Class Diagram). Основные вопросы Что такое диаграмма классов Компоненты диаграммы классов и их назначение Пример диаграммы.
Наследование и полиморфизм. «Быть» или «Иметь» а так же «Точно» или «Как получится»
Методология объектно- ориентированного программирования.
Высокоуровневые методы информатики и программирования Лекция 9 Делегаты.
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Полиморфизм Полиморфизм (polymorphism) - последний из трех "китов", на которых держится объектно-ориентированное программирование Слово это можно перевести.
НаследованиеНаследование2 class Point { double x; double y; Color color; }; class Radius { Point center; double radius; };
Транксрипт:

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

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

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

Связь классов программы Часто классы программы связаны между собой Два типа связи –агрегирование (ассоциация, has-a) - класс содержит объекты другого класса; –наследование (is-a) - один класс может быть производным от другого класса – наследовать его поля, свойство, методы Множество классов описывающих решаемую задачу называются - модель предметной области

Взаимозависимости классов в UML Типы взаимозависимостей (relationship) зависимость (dependency) – один класс временно использует (или знает) о другом классе, самая слабая, временная связь; ассоциация (association) – один класс использует объекты другого класса (has a) агрегирование (aggregation) – более сильная ассоциация между классами (owns a) композиция (composition) – очень сильная взаимосвязь между классами, отношение «часть- целое» (part-of) обобщение (generalization) отношение наследования (являться, is a)

UML обозначения 1.зависимость (dependency) 2.ассоциация (association) 3.агрегирование (aggregation) 4.композиция (composition) 5.наследование, обобщение (generalization)

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

Universal Modeling Language диаграмма Базовый класс (Родительский класс) Производный класс (дочерний класс) Universal Modeling Language (UML) язык для моделирования программ (программных систем). UML включает набор диаграмм для описания проектируемых программ. В UML есть диаграмма классов.

Наследование Manager "IS A" Human Programmer "IS A" Human ManagerTraineeSeniorManager ProgrammerManager Human

Наследование типов в CLR Object StringArrayValueTypeExceptionDelegateClass1 Class2 Class3 Multicast Delegate Structure1Enum Enum1 Встроенные типы BooleanChar Byte Int16 Int32 Int64 Single Double Decimal DateTime - Типы, описанные в системе - Типы, описанные разработчиками

Иерархия классов элементов управления Control ButtonBase ButtonCheckBoxRadioButton Label LinkLabel TreeView

Происхождение класса форм Form Control ScrollableControl ContainerControl Form Object...

Правило наследования Два класса, которые могут быть связаны с помощью отношения наследования должны пройти тест является видом … ("is a" test.) Например: Треугольник является видом фигуры Руководитель является видом служащего Легковой автомобиль является видом транспортного средства Например нельзя наследовать: велосипед не является видом колеса

Методы класса System.Object Equals() - виртуальный метод, возвращающий true если значения объектов совпадают (по умолчанию, если два объекта расположены в одном месте памяти). GetHashCode() - виртуальный метод, возвращает некоторое целое число (хэш-код), однозначно идентифицирующее экземпляр класса. GetType() - возвращает объект типа Type, описывающий соответствующий тип. ToString() - виртуальный метод, возвращающий символьное представление значения переменной (по умолчанию возвращает строку, представляющую полное имя типа объекта).

Equals() – по умолчанию этот метод возвращает true только в том случае, если сравниваемые элементы ссылаются на один и тот же объект в оперативной памяти. Таким образом, Equals() используется для сравнения ссылок на объект, а не состояния объекта. Обычно этот метод переопределяется (overridden) для возврата true в том случае, если сравниваемые объекты имеют одинаковые значения полей (internal state values). При переопределении Equals() также нужно переопределить метод GetHashCode(), так как он используется типом Hashtable для поиска объектов в коллекциях. GetHashCode() – этот метод возвращает целое число, которое идентифицирует конкретный экземпляр объекта класса. GetType() – этот метод возвращает объект типа Type, который полностью описывает объект, на который выполняется ссылка. Это метод динамической идентификации типа объекта (Runtime Type Identification, RTTI), который доступен для всех объектов. ToString() – этот метод возвращает текстовое описание объекта, используя формат. (называемое fully qualified name). Данный метод может быть переопределен в производном классе для возвращения строки с парами им/значения для описания внутреннего состояния объекта.

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

Классы-потомки при создании наследует все свойства и методы родительского класса Object. Естественно, что все встроенные типы нужным образом переопределяют методы родителя и добавляют собственные поля, свойства и методы. Учитывая, что и типы, создаваемые пользователем, также являются потомками класса Object, то для них необходимо переопределить методы родителя, если предполагается использование этих методов, а реализация родителя, предоставляемая по умолчанию, не обеспечивает нужного эффекта. Пример объявления переменных и присваивания им значений в языке C# показан ниже: int x=11; int v = new Int32(); v = 007; string s1 = "Agent"; s1 = s1 + v.ToString() + x.ToString();

Описание производного класса public class : { … } Наследование может быть только от одного класса Пример public class ColorPoint : Point { … }

Объект производного класса имеет доступ ко всем Открытым (public) свойствам и методам базового класса Защищенным (protected) свойствам и методам базового класса Методам переопределенным (override) в производном классе Свойствам и методам скрытым (new) в производном классе Любым свойствам и методам производного класса

Изолированные классы Можно создать класс, у которого не должны быть производные классы. Для этого используется ключевое слово sealed, которое сообщает компилятору, что для описываемого класса нельзя создавать наследников. Например, вы решили, что нет смысла делать наследников от класса MiniVan: // Данный класс нельзя наследовать! sealed class MiniVan : Car { } Если вы попытаетесь сделать класс производный от MiniVan то получите сообщение об ошибке: // Error! Cannot extend a class marked with the sealed keyword! class DeluxeMiniVan : MiniVan { … }

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

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

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

Сохранение семейных секретов: режим доступа protected Режим доступа: protected К элементам класса с режимом доступа protected имеется доступ в методах самого класса и методах производных классов.

Диаграмма наследования Методы Свойства Поля Новые Наследуемые от А Методы Свойства Поля Новые Наследуемые от B Наследуемые от А Методы Свойства Поля Методы Свойства Поля Методы Свойства Поля ClassA ClassB ClassC Элементы класса С class ClassA class ClassB : ClassA class ClassC : ClassB Все методы, свойства и поля - public и protected

Конструктор производного класса Конструктор производного класса может вызывать на выполнение требуемый конструктор базового класса. рublic Circle (int a, int b, int r) : base(a, b) { base._x = 0; // обращение в переменной // базового класса }

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

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

Тип объекта и тип ссылки Следует всегда различать –тип объекта (type of object) который используется –тип ссылки (type of reference) с помощью которой взаимодействуют с объектом. ClassA a; // тип ссылки ClassA (базовый ) a = new ClassB; // тип объекта ClassB (производный) Статическое и динамическое связывание ссылочная переменная Объект

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

Скрытие метода базового класса 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" ….

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

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

Пример Figure Rectangle Triangle Point

Базовый класс class MyBaseClass { private int v; public int Val {…}... public int fn(…) {…}... }... MyBaseClass a = new MyBaseClass; n = a.fn(); MyBaseClass b; b = a v MyClass Val fn Nothing

Производный класс – скрытие функции c lass 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 Val1 fn v v1 v Ссылка на производный класс Ссылка на базовый класс MyBaseClass Val fn Вызываемая функция определяется типом ссылки

Производный класс – переопределение функции 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 Val1 fn v v1 v Ссылка на производный класс Ссылка на базовый класс MyBaseClass Val fn Вызываемая функция определяется типом объекта vtb

Полиморфизм (Polymorphism ) Множество объектов может внешне выглядеть одинаково, но выполнять методы они могут по разному С объектами производных классов можно работать, как с объектами базового класса Используя полиморфизм можно создавать общие алгоритмы для любых объектов производных от базового класса

Наследование Базовый класс (Base Class) –Person Производные классы (Subclasses) –Employee –Customer –Student Person -Name -Address -Phone Salary() Seller Salary() Worker Salary() Engineer Salary()

Полиморфизм Массив 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();