Наследование и полиморфизм. Наследование классов презентация

Содержание

Основная: Павловская Т.А., Щупако Ю.А. C/C++. Структурное программирование, Питер, 2005. – 402 с. Дополнительная: Гросс К. С# 2008: Пер. с. анг. – СПб. БХВ-Петербург, 2009. – 576 с. Троелсен Э.

Слайд 1Тема 6
Наследование и полиморфизм

Лекция 6.1.
Наследование классов.


Слайд 2Основная:
Павловская Т.А., Щупако Ю.А. C/C++. Структурное программирование, Питер, 2005. – 402

с.
Дополнительная:
Гросс К. С# 2008: Пер. с. анг. – СПб. БХВ-Петербург, 2009. – 576 с.
Троелсен Э. Язык программирования С# 2005 и платформа /NET 2.0:пер. с анг. – М:. ООО «И.Д. Вильямс, 2007. – 1168 с.

Литература


Слайд 3Вопросы:
1. Иерархия и типы классов.
2. Конструкторы и деструкторы.
3. Иерархия классов .NET

Framework.

Слайд 41. Иерархия и типы классов.


Слайд 5Все классы в программе являются чьими-то наследниками. Наследование обеспечивает:
сокращение объема программы.

При создании нового класса нет необходимости повторного описания всех полей, свойств и методов. В наследник вносят только необходимые изменения и дополнения;
многократное использование программного кода. Нет необходимости все создавать заново. Например, типовые элементы интерфейса Windows (меню, панели, кнопки и т.д.) применяют все разработчики программ. Это повышает производительность труда программиста, надежность программ, удобство применения программ за счет стандартизации интерфейса.

Слайд 7В случае отношения подчиненности между типами существует зависимость. Новые классы используют

возможности исходных классов. В простом варианте смысла нет, новый класс повторяет возможности исходного. Поэтому в порожденный класс включают новые возможности, специфичные для вновь создаваемого класса.
Например, исходный класс Auto (автомобиль) содержит члены, характеризующие наиболее общие свойства автомобиля (марка, номерной знак, год выпуска т.п.). На основе этого класса можно создать несколько порожденных для характеристики легковых, грузовых, специальных автомобилей, автобусов, каждый из которых имеет свою специфику (для автобуса надо дополнительно указать количество мест для пассажиров, для грузовика – грузоподъемность).

Слайд 8Каждый класс должен иметь в точности один исходный базовый класс, нельзя

иметь класс, имеющий два или более базовых классов.
Производные классы имеют доступ к защищенным (protected) членам. Тем самым между базовым и производным классом устанавливается некоторый уровень «доверия», ибо производный класс получает доступ к внутренним типам базового класса через этот интерфейс.
Для кода вне производного класса защищенные члены воспринимаются как приватные.


Слайд 9Корневым классом всех других классов является класс System.Object (синоним object). Это

класс реализует наиболее общие для всех классов элементы, например, действия по созданию и удалению объекта. Если производный класс является прямым потомком класса Object указывать родительский класс не надо.
Например, описание класса следующего вида
public class Auto
{
public string marka; //марка автомобиля
public string nomer; //номерной знак автомобиля
}
означает, что Auto является наследником класса System.Object.


Слайд 10При наследовании члены исходного класса передаются потомку. Это позволяет экономно описывать

новые классы, добавляя к производному классу новые элементы, не повторяя описание членов исходного класса.
В описании заголовка класса – наследника через двоеточие указывается имя базового класса. Например, создание класса – наследника Bus от класса Auto
public class Bus : Auto
{
public int KolPas;
. . . //описание новых полей, свойств и методов класса Bus
}
При работе только с объектом типа Bus в программе создаются объекты именно этого типа
Bus autobus =new Bus();
autobus.marka=”Volvo”;
autobus.KolPas=86;

Слайд 11Обращение к членам объекта производится так, как будто члены родительского объекта

включены в состав порожденного объекта.
От производного класса можно создавать новых наследников, глубина наследования не ограниченна. Количество наследников также не ограничено.
Отношения классов при наследовании можно представить в виде дерева. В этой структуре каждый класс имеет только одного предка и может иметь произвольное количество потомков. Корнем дерева является класс System.Object.
Рассмотренные ранее типы данных, такие как int, double, string, тоже являются классами, программа также объявляется как класс.
Чем дальше тот или иной класс отстоит в дереве от базового класса, тем большей специфичностью он обладает.
 


Слайд 12Отношение «содержит» существенно отличается от отношения «является», т.е. от прямого наследования.

Между объектами могут существовать не только отношения подчиненности, но отношение вхождения. Например, одна и та же марка автомашины выпускаются с различными двигателями, а двигатели могут существовать не только в составе автомобиля. Поэтому двигатель автомашины также следует считать классом
public class Dvigatel
{
private int power; //мощность
. . . //описание других свойств и полей
public int moshnost
{
get { return power; } //метод чтения поля мощность
set { power = value; } //метод занесения значения в поле
}
}

Слайд 13Класс Auto должен содержать описание двигателя. Допускается в описание одного класса

включать ссылки на другие классы. Следовательно, должно существовать средство описания такой ситуации как «объект1 имеет объект2». Описание класса Auto с подключением класса Dvigatel двигатель
public class Auto
{
private string nomer; //номерной знак автомобиля
. . . //описание других свойств и полей
public Dvigatel dvigAuto; //содержит вложенный объект
//двигатель
  }


Слайд 14Создание объекта Auto1:
//вначале создание объекта двигатель
Dvigatel motor23 =new Dvigatel

();
//установка мощности, рабочего объема двигателя
motor23.moshnost=120;
// установка других свойств двигателя
. . .
Auto car1 = new Auto(); // создание объекта автомобиль
car1.dvigAuto = motor23; //установка свойств двигателя для автомобиля
. . . // установка других свойств автомобиля
Для доступа к полям объекта «двигатель» используют двухступенчатую ссылку, например,
car1.dvigAuto.moshnost=120;
Возможен и другой подход – на основе делегирования. Делегирование означает включение в класс – контейнер таких членов (свойств, методов), которые будут использовать возможности включенного объекта. Описание этих свойств и методов производится аналогично их описанию для защищенных полей.

Слайд 15Существует несколько различных типов классов. Эти типы характеризуются независимыми признаками.
Статические классы
Иногда

целесообразно использовать классы, имеющие только статические члены, которые не применяются для создания объектов (например, класс Console). Если класс определен как статический, то он не допускает создания экземпляров с помощью конструктора. Нарушение этих условий приводит к ошибке компиляции. Описание такого класса содержит ключевое слово static. Статические классы могут обладать статическим конструктором.
Абстрактные классы
Эти классы содержат в своем объявлении слово abstract и включают нереализованные методы. Такие классы должны иметь наследников, в которых эти методы находят воплощение. Абстрактные классы не могут служить источником создания экземпляров.


Слайд 16Изолированные классы
Иногда необходимо определить класс, который не должен иметь наследников. В

описании такого класса добавляют слово sealed (запечатанный)
public sealed class LiAuto : Auto
После такого описания класс LiAuto не может служить базовым для других классов. Это дает защиту от вмешательства потомков в данные класса. Например, нельзя разрешать программисту расширение класса, реализующую систему безопасности. В противном случае имеется возможность создать черный ход, минующий эту систему.


Слайд 17Возможные комбинации модификаторов класса:
- модификатор отсутствует или internal. Доступ к классу

можно получить только из текущего проекта;
- public. Доступ к классу можно получить из любого места;
- abstract или internal abstract. Доступ к классу можно получить только из текущего проекта. Класс не допускает создание экземпляров;
- public abstract. Доступ к классу можно получить из любого места. Не допускает создание экземпляров;
- sealed или internal sealed. Доступ к классу можно получить только из текущего проекта. Не допускает создание производных классов;
- public sealed. Доступ к классу можно получить из любого места. Не допускает создание производных классов.


Слайд 182. Конструкторы и деструкторы


Слайд 19Конструкторы
Базовая инициализация объекта осуществляется автоматически. Например, заботиться о поиске места в

памяти для размещения нового объекта не нужно. Однако иногда бывает необходимо, чтобы на стадии инициализации объекта выполнялись дополнительные действия, например, требуемая инициализация хранимых объектом полей. Для осуществления подобных действий применяется функция-конструктор.
Все объекты имеют конструктор по умолчанию, который представляет собой не принимающий параметров метод с таким же именем, как у самого класса. Определение класса может включать несколько методов-конструкторов, принимающих разные параметры. Такие конструкторы позволяют создавать экземпляр объекта различными способами, например, предоставляя различные начальные значения для хранимых в объекте данных.


Слайд 20Конструктор вызывают с использованием ключевого слова new.
Например, создать экземпляр класса

UchDiszip с применением конструктора по умолчанию можно следующим образом:
UchDiszip ALiP = new UchDiszip ();
Членам – полям объекта конструктор по умолчанию присваивает определенные значения:
- числовым данным – значение 0;
- данным логического типа – false;
- данным ссылочного типа, в том числе для типа string – null;
- данным типа char – ‘\0’.
Локальным переменным при объявлении следует присваивать значение, так как локальные переменные не получают значение по умолчанию.

Слайд 21Результаты работы конструктора по умолчанию при создании объекта не всегда не

отвечает потребностям практики. Кончено, после создания объекта можно, обращаясь к свойствам и методам, установить требуемые значения полей. Однако некоторые поля могут быть недоступны, а не установленные программистом требуемые значения какого-либо поля могут привести к трудно обнаруживаемой ошибке времени выполнения.
Преодоление этой проблемы осуществляют, используя конструкторы не по умолчанию. Например, у класса UchDiszip ее может осуществить конструктор не по умолчанию, во время создания экземпляра принимающий параметр для установки – количество учебных часов:
UchDiszip ALiP = new UchDiszip (160);


Слайд 22Конструкторы, подобно полям, свойствам и методам, могут быть общедоступными или приватными.

Код, являющийся внешним по отношению к классу, не может создавать экземпляр объекта с помощью приватного конструктора; он должен обязательно использовать общедоступный конструктор. Это позволяет, например, заставить пользователей классов применять конструктор не по умолчанию (объявляя конструктор по умолчанию приватным).
Конструктор – это метод, имя которого совпадает с именем класса.

Слайд 23Пусть имеется класс
public class Kursant
{
private string Name;
private string Gruppa;

private Matricul;
. . .
public Kursant (string Fam, string UchGruppa,int ZachetBook) //конструктор не по умолчанию
{
Name=Fam;
Gruppa= UchGruppa;
Matricul= ZachetBook;
}
}


Слайд 24Создание объекта путем вызова конструктора не по умолчанию
Kursant Kur1= new Kursant(“Иванов”,”ПМ27”,

489);
Конструктор не по умолчанию обязательно имеет формальные параметры. Таких конструкторов у класса может быть несколько. Они должны различаться типом или составом параметров.
При объявлении хотя бы одного конструктора не по умолчанию конструктор по умолчанию становится недоступен. Для того, чтобы он стал доступным, необходимо в описании класса, наряду с другими конструкторами объявить его. Например, для класса Kursant объявление конструктора по умолчанию
public Kursant()
{
}
Конструктор по умолчанию не имеет параметров.

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

по умолчанию это делает автоматически. Деструктор по умолчанию вызывается неявно, когда объект выходит за пределы видимости или перед завершением программы. Иногда требуется выполнить специфические действия перед удалением объекта, например, удалить созданные временные файлы. В этом случае необходим деструктор не по умолчанию. Такой деструктор имеет то же имя, что и имя класса, перед которым стоит знак тильды (~)
~Kursant()
{
. . .//тело деструктора
}

Слайд 26Когда переменная выходит за рамки области видимости (становится недоступной), она при

этом все равно может существовать где-то памяти. Только после выполнения исполняющей средой операции по сборке мусора (garbage) экземпляр уничтожается полностью. Аналогично и код деструктора выполняется также на этапе сборки мусора. Это может произойти спустя много времени после того, как объект перестанет быть нужным.

Слайд 27Статические конструкторы
В случае применения статических членов в классе может возникать желание

инициализировать их заранее. Конечно, можно предоставить статический член с начальным значением в виде части объявления, но иногда требуется осуществить более сложную инициализацию или, возможно, выполнить какие-то другие операции перед присваиванием значений или переходом к выполнению статических методов.
Для выполнения подобных задач в процессе инициализации предусмотрены статические конструкторы. У класса может быть только один статический конструктор, у которого не должно быть никаких модификаторов доступа и не может быть никаких параметров.

Слайд 28Статический конструктор никогда нельзя вызывать напрямую. Его можно вызывать в одном

из следующих случаев:
при создании экземпляра класса, в котором содержится данный статический конструктор;
при получении доступа к статическому члену класса, содержащему данный статический конструктор.
В обоих этих случаях сначала вызывается статический конструктор и только потом создается экземпляр класса или представляется доступ к статическим членам. Сколько бы экземпляров класса не создавалось, его статический конструктор будет вызываться только один раз. Чтобы отличать статические конструкторы от ранее описанных, все нестатические конструкторы также называют конструкторами экземпляров.

Слайд 29Если не указано иное, то при создании объекта класса вызывается конструктор

по умолчанию. Когда создается подкласс, всякий раз перед этим вызывается конструктор по умолчанию базового класса, тот, в свою очередь, конструктор своего базового класса и т.д. до конструктора класса Object. Другими словами, сначала создается объект класса Object, потом подчиненный ему объект и т.д. Последним создается объект, для которого явно вызван конструктор. Такой порядок вытекает из свойства наследования – каждый класс «отвечает» сам за себя, т.е. подкласс не отвечает за инициализацию базового класса.
Конструктор подкласса может вызвать определенный конструктор базового класса с использованием ключевого слова base. Пусть базовый класс содержит переопределенный конструктор по умолчанию и конструктор не по умолчанию

Слайд 30public class Auto
{
public Auto() //конструктор по умолчанию
{

. . . //реализация конструктора по умолчанию
}
public Auto(string, string) //конструктор не по умолчанию
{
. . . //реализация конструктора не по умолчанию
}
. . .
}

Слайд 31Подкласс
public class Bus: Auto
{
public Bus() //конструктор по умолчанию

{
. . .
}
public Bus (string s1, string s2, int i1):base (s1, s2)
{ //конструктор не по умолчанию
. . .
}
. . .
}

Слайд 32Создание объектов в основной функции с помощью
//конструктора по умолчанию
Bus Bus1= new

Bus();
//конструктора не по умолчанию
Bus Bus2=new Bus(“Volvo”,”a390oc98”,120);

Слайд 333. Иерархия классов .NET Framework


Слайд 34Программа на языке С# может содержать любое число определенных типов данных.

Здесь тип обозначает любой элемент множества, принадлежащего классу, структуре, перечню и т.д. Платформа .NET предоставляет программисту, кроме всего прочего, библиотеку базовых классов – Common Type System (CTS, система общих типов). Спецификации CTS описывают возможные типы данных, допустимые программные конструкции, способы взаимодействия этих компонентов.
Библиотека CTS обслуживает все языки программирования для платформы .NET. Поэтому не все возможности этой платформы могут быть реализованы в конкретном языке программирования, а названия типов и методов в конкретном языке программирования могут отличаться от установленных в самой платформе. Большинство типов имеют в своем составе множество членов. Спецификация CTS определяет различные характеристики каждого члена, например, доступность, абстрактность, статичность и др.

Слайд 35Библиотека базовых классов CTS включает:
- описание простых типов данных. Спецификации CTS

определяют четкий набор базовых типов данных. Однако описание типа данных в CTS отличается от принятых обозначений в различных языках программирования;
- средства управления вводом-выводом, управления потоками данных;
- средства управления доступом к базам данных;
- средства обработки ошибок времени выполнения;
- средства создания графического интерфейса программы;
- средства работы в вычислительных сетях и др.

Слайд 36Любой язык предполагает использование готовых библиотек для решения стандартных задач, таких,

например, как вычисление математических функций. Но технология .NET не предлагает библиотек с программным кодом для конкретного языка, при программировании применяются библиотеки, нейтральные в языковом отношении. Эти библиотеки организованы в так называемые пространства имен. Упрощенно пространство имен – это описание группы взаимосвязанных типов, организованное в отдельном программном блоке.
Главным из пространств имен является пространство System, без которого невозможно создать ни одного приложения. Пространство содержит описание внутренних типов данных, математических функции, управляет выполнением конструкторов и деструкторов, обработкой исключительных ситуаций и т.д.
Некоторые из пространств имен

Слайд 38Полное перечисление пространства имен практически нецелесообразно, его можно просмотреть в справочной

системе. При программировании, если не указано необходимое пространство имен, то при компиляции будет выдана соответствующая подсказка об отсутствии компонента в текущем контексте. Например, при отсутствии в программе описания
using System;
будет выдана серия сообщений об ошибках такого вида
Ошибка 1 Элемент "Console" не существует в текущем контексте.

Слайд 39Вопросы для самоподготовки
Понятие и виды доступности элементов класса и объекта.
Обращение к

методу.
Способы передачи данных в метод и возвращения результатов работы метода.
Обращение к полям и свойствам объекта и класса.
Изучить постановку задачи на практическое занятие.


Обратная связь

Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое ThePresentation.ru?

Это сайт презентаций, докладов, проектов, шаблонов в формате PowerPoint. Мы помогаем школьникам, студентам, учителям, преподавателям хранить и обмениваться учебными материалами с другими пользователями.


Для правообладателей

Яндекс.Метрика