1. Иерархия и типы классов.
246.00K
Категория: ПрограммированиеПрограммирование

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

1.

Тема 6
Наследование и полиморфизм
Лекция 6.1.
Наследование классов.

2.

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

3.

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

4. 1. Иерархия и типы классов.

5.

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

6.

Типы
наследования
Наследование
по принципу
подчиненности
(класс является)
Включение
в другие классы
или
делегирование
(класс содержит)
is - a
has – a

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

18.

2. Конструкторы и деструкторы

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

30.

public 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);

33.

3. Иерархия классов .NET Framework

34.

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

35.

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

36.

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

37.

System
System.Array
System.Linq;
System.Text
System.IO
System.Net
System.Security
System. Exception
System.Windows.Forms
Описание базовых простых и сложных типов
данных, реализация методов класса Object
Описание массивов
Средства формирования запросов к базам
данных
Классы, представляющие кодировки символов;
абстрактные базовые классы для
преобразования символов в байты и обратно;
класс поддержки, управляющий объектами
String
Средства обеспечения ввода-вывода данных
Средства обеспечения сетевого
программирования
Средства разрешения доступа,
криптографической защиты
Представляет ошибки, происходящие во время
выполнения приложения
Средства поддержки создания графического
интерфейса программы

38.

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

39.

Вопросы для самоподготовки
1.
2.
3.
4.
5.
Понятие и виды доступности элементов класса и объекта.
Обращение к методу.
Способы передачи данных в метод и возвращения
результатов работы метода.
Обращение к полям и свойствам объекта и класса.
Изучить постановку задачи на практическое занятие.
English     Русский Правила