Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры С# 2.doc
Скачиваний:
23
Добавлен:
22.09.2019
Размер:
266.75 Кб
Скачать

24. Базовые классы и наследование. Доступы к членам классов.

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

Т.о.наследование упрощает многократное использование программного кода.

Наследование бывает 2-х видов:

-классическое(отношение подчиненности);

- модель локализации\диллегирования(объект уже не явл.уточненной версией др.объекта, а содержит в себе этот объект);

Наследование часто применять не нужно, а лишь там, где оно оправдано.

Класс, кот.наследуется, наз.базовым; кот. наследует базовый – производным. Следовательно, производный класс – специализированная версия базового класса. При объявлении производного класса сначала записывается Имя_ производного класса: Имя_ базового.

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

Доступы к членам классов и наследования.

В классах проекта Figura поля класса объявлены как public. Здесь нарушен принцип инкапсуляции. Можно эти поля объявить как private, но тогда производные классы не получат доступа к ним. Есть 2способа решения проблемы доступа к закрытым членам базового класса:

1.использовать public-свойства или методы, позволяющие получить доступ к закрытым членам базового класса;

2.использовать уровень доступа protected(защищен).

Использование защищенного доступа.

Защищенным явл. член класса, кот. открыт для своей иерархии класса, но закрыт вне этой иерархии.

Защищен.член класса созд. с помощью модификатора доступа protected. По сути он явлю закрытым, но с одним исключением. Это исключение вступает в силу, когда защищен.член класса наследуется. В этом случае защищен.член базового класса становится защищен.членом производного класса, а следовательно доступным для производного класса.

25.Конструкторы и наследование. И базовые классы, и производные классы могут иметь собственные конструкторы. Какой же конструктор отвечает за создание объекта производного класса? Конструктор базового класса создает часть объекта соответствующую базовому классу, а конструктор производного класса создает часть объекта соотв.производному классу. Если конструктор определен только в производном классе, то просто создается объект производного класса. Если конструкторы определены и в базовом, и в производном, то должны выполнятся конструкторы обоих классов. В этом случае используют ключевое слово base, кот. имеет 2 назначения: -вызвать конструктор базового класса; -получить доступ к членам базового класса. Формат объявления: Конструктор_производного_класса(Список параметров): base (список_аргументов) {//тело конструктора} В списке аргументов задаются параметры из списка производного класса, необходимы конструктору базового класса. Ключевое слово base всегда отсылает к базовому классу, стоящему в иерархии классов непосредственно над вызывающим классом. Чтобы передать аргументы конструктору базового класса, нужно указать их в base ч-з запятую и без типа. При отсутствии слова base автоматически вызывается конструктор базового класса действительно по умолчанию. Если в иерархии классов(Figura-Rectangle-Kwadrat)конструктору базового класса требуются параметры, то все производные классы должны передавать эти параметры независимо от того, нужны ли эти параметры самому производному классу. В иерархии классов конструкторы вызыв-ся в таком порядке:сначала работает конструктор базового класса, а затем конструктор производного класса. Этот порядок не наруш-ся, если использ-ся base,т.к.: -базовый класс ничего не знает о производном и он обязан инициализировать свои члены-переменные. -в производном классе тогда можно не инициализировать общие члены-переменные.

26. Ссылки на базовый класс и объекты производных классов. В С# строго соблюдается совместимость типов. Это зн., что ссылочная переменная одного классового типа обычно не может ссылаться на объект другого классового типа. Однако ссылочную переменную базового класса можно присвоить в ссылке на объект производного класса. Важно понимать, что именно тип ссылочной переменной определяет какие члены, каких классов могут быть доступны. Это зн.,что и ссылку на производный класс можно присвоить ссылочной переменной базового класса. Тогда получим доступ только к тем частям, кот. определены базовым классом. Это особенно важно, если в иерархии классов есть классы с конструкторами-копировщиками(конструкторы, кот. в качестве параметра принимают объект своего же класса)

27.Виртуальные методы и их переопределение. Виртуальным наз.метод, объявленный с помощью слова virtual в базовом классе и переопределяемый в одном или нескольких производных классах. Каждый производный класс может иметь свою собственную версию реализации виртуального метода. Именно ч-з ссылку на базовый класс будет вызываться необходимая версия виртуального метода. По типу объекта, на который указывает ссылка, и вызывается нужный метод. Причем решение принимается динамически, т.е.во время выполнения программы. При определении виртуального метода пишут: public virtual <тип возврата>Имя метода(…){ … } При переопределении вирт.метода в производном классе пишут public override <тип возврата>Имя метода(…){…}

Переопределение метода наз.замещением метода. Примечания:

1.при переопределении метода сигнатуры(списки параметров) и типы возвратов у вирт.метода и метода-заменителя должны совпадать.

2.вирт. метод нельзя определять как static-метод

3.вирт.метод переопределять не обязательно. В этом случае будет выполняться версия определенная в базовом классе

4.свойства можно разрабатывать со словом virtual, а затем с помощью слова override переопределять их в производном классе

Переопределение вирт.метода –основа для одной из самых мощных концепций С#: динамической диспетчеризации метода. – это механизм метода во время выполнения программы, а не в период компиляции. Благодаря такому механизму реализ-ся: динамический полиморфизм и наследование. Сочетая наследование с возможностью переопределения методов в базовом классе можно определить общую форму методов, кот.будет использ. Производными классами. Например, в классе Figura можно разработать вирт. методы Площадь и Периметр, и переопределять их в производных классах.

28.Использование абстрактных классов. Иногда создают класс, определяющий своего рода пустой бланк. Производные классы этого базового класса должны «заполнить» бланк своей инфо. Такой класс не обеспечивает реализацию одного или нескольких методов. Он просто говорит о том, что будет метод с таким-то именем. Можно заставить производные классы переопределить методы, кот.в базовом не имеют никакого смысла. Для этого и служат абстрактные методы, кот.записываются: abstract Тип возврата Имя_ метода(сигнатуры);

абстрактный метод не содержит тела и, следовательно, не реализуется базовым классом. Поэтому производный класс должен его переопределить. Абстр.метод автоматически явл.виртуальным. поэтому virtual писать не надо. Примечание: 1.модификатор abstract использ. только для обычных методов, а не для static-методов. 2.свойства также могут быть абстрактными. 3.класс, содержащий 1 или несколько абстрактных методов д.б. объявлен как абстрактный (перед Class- abstract) 4.нельзя создавать объекты абстрактного класса,т.к. он полностью нереализуем. Переопределение методов класса Object. Class Object явл.неявным базовым классом всех других классов и типов данных(int,long). Это зн., что переменные типа Object может указывать на объект любого типа. Этот класс имеет несколько методов. Например, метод Equals(Object Ob1, Object Ob2) определяет: является ли объект Ob1 таким же как объект Ob2, но он для получения результата вызывает перегруженный метод Equals (Object Ob), кот.определяет является ли вызывающий таким же как объект parameter, а точнее являются ли ссылки вызывающего объекта и объекта-аргумента одинаковыми. Когда сравниваются(==,!=) 2 объекта, то вызывается метод Equals из базового класса. По умолчанию он не знает объект какого класса к нему поступил. Поэтому в производном классе, где будут операторы сравнения, нужно переопределить методы Equals и GetHashCode() public override bool Equals(Object Ob)

{ if (!(Ob is Point)) return false; else return this==(Point)Ob; } Роль метода GetHashCode(): возвратить числовое значение, кот. идентифицирует объект в памяти в зависимости от его состояния. Если объекты по содержанию одинаковы, то у них будет одинаковый GetHashCode public override int GetHashCode()

{return ToString().GetHashCode(); }

30. Интерфейсы. Реализация интерфейсов. В ООП иногда требуется определить, что класс должен делать?, а не как он будет делать. Один из механизмов реализации этой идеи – это абстрактные методы. Абстрактный метод определяет лишь сигнатуру, но не обеспечивает его реализацию. Т.о. абстрактный метод задает интерфейс для метода, но не способ его реализации, идея абстрактных классов и методов развив-ся далее путем отделения интерфейса класса от его реализации. Для этой цели и служат интерфейсы. интерфейсы позволяют объектам быть более обобщенными и гибкими. Класс может содержать ссылку на другой класс. Напр., в классе Otrezok им. ссылка Point B=new Point(); такое простое отношение наз. отношение СОДЕРЖИТ. Один класс может расширять другой класс с помощью наследования – это отношение ЯВЛЯЕТСЯ. Еще одно отношение МОЖЕТ_ИСПОЛЬЗОВАТЬСЯ_КАК. Интерфейс можно рассм.как класс-сервер, а др. классы, использующие его – классы-клиенты. Интерфейсы напоминают абстрактные классы, у кот.все члены явл. абстрактными, интерф. может сод-ть только объявления событий, методов, св-в и индексаторов, а их реализация должна нах-ся в классе, кот. реализует интерф. Интерф. не сод.констант, членов переменных, конструкторов, деструкторов и стат.членов. Когда интерф. определен, его может реализовать любое кол-во классов.при этом один класс может реализовать любое кол-во интерф. если какой-то метод интерф. не будет иметь реализацию, то компилятор выдаст ошибку. Кажд. член может определить собств.реализацию.

Определение интерфейса. Интерф. Опред-ся с пом. Ключ. слова interface. Все члены интерф. по умолчанию счит-ся открытыми (public). Интерф. созд-ся в отдельных файлах .cs. меню Project-Add New Item-interface. Чтобы отличить интерф. от классов интерф. имеет префикс I.

Форма определения: interface имя {Тип _возврата Имя_метода1(список параметров); Тип _возврата Имя_метода2(список параметров); //могут быть св-ва, события, индексаторы} Реализация интерфейса. Чтобы реал-ть интерф. Необх. ч-з двоеточие после имени класса указать имя базового класса «,» имя интерфейса1, имя интерфейса2 и т.д. Вызов членов интерф. 1.на уровне объекта. В Main() метод интерф.вызыв-ся как обычный эл-т класса, например, Console.WriteLine(«количество вершин у точки»+T2.GetTops()); 2.выяснить во время работы программы, поддержив-ся ли интерф. каким-то классом можно с пом.as. если объект можно интерпретировать как указанный интерф., будет возвращена ссылка на интерф., если нет – получим null ссылку. Если класс реализует интерф., кот. унаследует другой интерф. , этот класс должен обеспечить способы реализации для всех членов, определенных внутри цепочки наследования интерф. Станд.интерфейсы среды .NET Framework. В С# пр-мах можно исп-ть станд.интерфейсы среды. например,1. IEnumerable и IEnumerator – служат для работы с перечислимыми типами: перечень названий шрифтов, набор размеров, начертаний шрифтов. Перечисления применяются при работе с коллекциями. For each in Коллекция. 2. ICloneable –служат для создания планируемых объектов. Интерф. ICloneable содержат только один метод: Object Clone(); его назнач. – копировать значения членов-переем. какого-то объекта в новый экземпляр объекта и возвращать этот экземпляр. 3. ICompanable (создание сравнимых объектов). В нем имеется метод int ConpareTo(object Ob); Он позволяет указать связь между объектами Ob и др.подобными объектами, если метод возвращает единицу, то текущий объект должен размещаться после указанного объекта. Если метод возвращает 0, то текущий объект равен указанному объекту; если - -1, то такой объект разм-ся пред указанным объектом.

31. Коллекции. Классы коллекций общего назначения. С помощью интерфейсов можно реализовать не только множественное наследование, но и разработать коллекции классов. Коллекции упрощают программирование, предлагая уже готовые решения для построения структур данных, разработка кот. «с нуля» отлич-ся большой трудоемкостью. Слова коллекции, семейства, контейнеры – это слова-синонимы. самая примитивная коллекция – это System.Array. но ограничение этой коллекции состоит в том, что невозможно динамически управлять размером массива при добавлении или удалении элементов. Коллекции реализуют технологию обобщенного пр-мирования. Оно появилось еще в языке С++. Целью обобщенного пр-мирования явл. создание прграммного кода, независимо от типов данных. Для этого были разработаны шаблоны типов данных. Наиболее употребляемые: стеки, списки, очереди, векторы, а также алгоритмы их обработки были помещены в стандартную библиотеку шаблонов STL. Ее авторы- Алекс Степанов, Мен Ли. В новой технологии .NET как таковой библиотеки нет, а им-ся классы коллекции. Среда .NET поддерживает 3осн.типа коллекции:-общего назначения,-специализированные,-ориентированные на побитовую организацию данных. Классы коллекций общего назначения. Служат для временного хранения данных во время работы пр-мы, реализуют осн.структуры данных: динамический массив, стек, очередь. Очередь – последовательный набор элементов одногои того же типа, кот. может сокращ-ся с одного конца(начала очереди), а расширяться с другого(конца очереди). В любой момент времени доступен только один элемент, кот. нах-ся в начале очереди. Удаляется тот элемент, кот. был первым. Очереди исп-ся в СУБД, в Интернете, в Моделировании. К-ции общего назначения раб. С данными типа object. К-ции спец назнач. – ориентированы на обработку данных конкретного типа, или на обработку данных уникальным способом. К-ции ориентированные на побитовую орг-ю данных служат для хранения групп битов и исп-т только побитовые операции:сдвиг вправо, влево. Они примен-ся для разработки драйверов.

34. Обзор технологий программирования Windows-приложений. Программирование на С с использованием Win32API; Visual Basis язык для работы с объектами, он не объектно-ориентированный. Предн.для работы с объектами и позволял более легко строить граф.интерфейс. Прогр-ние на С++ и исп-ние библиотека MFC(Microsoft Foundation Classes, сложный для чтения код). Технология СОМ – Microsoft Component Object Model – модель многокомпонентных объектов для разработки приложений-серверов и приложений-контейнеров. Упрощение для СОМ – библиотека ATL. Модель многокомпонентных объектов явл. двоичным стандартом интерфейса объектов в Windows. Это означает, что выполняемый программный код (в файлах .DLL или .EXT), который описывает объект, может быть вызван на выполнение другим объектом. Даже если оба объекта были написаны на разных языках, они сохраняют возможность взаимодействия между собой, используя стандарт СОМ. Приложения: -Приложения Windows.Forms (это технология, построенная на базе управляемых классов и являющаяся частью среды .NET). С помощью Windows. Forms можно быстро создавать интерфейсы для своих приложений, рассчитанных на использование Web. - приложения типа Web-службы без интерфейса. Ядром стратегии .NET являются Web-службы. Web-службы представляют свои функциональные возможности по Internet с помощью определенных стандартов и протоколов. Например, XML и SOAP. Простые примеры существующих Web-служб – электронная почта, службы поддержки Internet-чатов. Цель таких приложений – управление хранением файлов, защита информации и др. -Проекты ASP.NET. ASP(Active Server Page)– активные серверные страницы– популярная технология для создания Web-приложений. Web-сервер– это программный продукт, на котором размещают ваши Web-приложения и кот. обеспечивает набор, связанных с Web-приложениями служб, таких как: Интегрированные ср-ва обеспечения безопасности; Поддержка протокола FTP; Поддержка средств передачи электронной почты и т.д.

35. Архитектура Windows Forms. Класс Forms. Windows Forms (Формы Windows) — это та часть каркаса .NET Framework, кот.поддерживает создание приложений со стандартным графич.пользоват. интерфейсом (GUI) на платформе Windows. Windows Forms создают более однородную (гомогенную) стр-ру и устраняют многие ошибки и противоречия от использования Windows API. Написание приложения с исп-нием Windows Forms потребует меньшего кол-ва кода, чем приложения, кот.исп-т Windows API или MFC. Другая выгода от Windows Forms - используется тот же самый API, независимо от языка прогр-ния. Windows Forms — название той части .NET Framework, кот.отвечает за графич. интерфейс пользователя. Windows Forms «оборачивает» в управляемый код стандартные элементы управления Windows, доступные при помощи Win32 API. Причем управляеый код - классы, реализующие API для Windows Forms, не за висят от языка разработки. Внутри .NET Framework, Windows Forms реализуется в рамках пространства имён System.Windows.Forms. Формы Windows реализуются набором классов из пр-ва имен Systems.Windows.Forms. В основе почти каждого приложения, написанного с применением Windows Forms, - производный класс от System.WinForms.Form. Приложения, основанные на Windows Forms, которые используют кнопки, списки и другие типы компонентов Windows, используют классы управления System.WinForms, значительно упрощающие программирование управления.

36.Эл-ты управления формы. В Windows Forms термин "форма" - синоним окна верхнего уровня. Главное окно приложения - форма. Любые другие окна верхнего уровня, окна диалога - также формы. Формы позволяют отображать различные типы окон.

Для создания формы, идентичной существующей, в проект следует добавить элемент Inherited Form и указать класс копируемой формы.

Приложения, использующие Windows Forms используют классы System.WinForms. Этот раздел включает такие классы, как Form, который моделирует поведение окон или форм; Menu, который представляет меню; Clipboard, который дает возможность приложениям использовать буфер обмена. Другой важный "строительный" блок приложения класс System.WinForms по имени Application. Этот класс содержит стат.метод Run, кот. загружает приложение и отображает окно.

Автоматическое масштабирование формы. Если форма создавалась при размере системного шрифта, установленного через апплет Display (Экран) панели управления в Normal (Обычный) (96 DPI), то пользователь может сменить шрифт на Large (Крупный) (120 DPI) или выбрать какое-нибудь нестандартное значение.

Одного масштабирования системных параметров шрифтов недостаточно для поддержки подстройки формы под запросы пользователей.

Создание новой формы

Для создания и отображения новой формы следует вызвать конструктор формы и затем вызвать метод Show. При этом, если создаваемая форма является дочерней, то следует установить значение свойства MdiParent.

Например: // Создание нового экземпляра дочерней формы Form childForm = new Form(); // Делаем форму дочерней // для MDI-формы // до ее отображения childForm.MdiParent = this; childForm.Text = "Window " + childFormNumber++; childForm.Show(); // Отображаем дочернюю форму

Закрытие формы

Закрытие формы выполняется вызовом метода Close. Для того, чтобы закрыть все дочерние формы в MDI-приложении, следует использовать свойство MdiChildren, содержащее массив дочерних форм.

Например: private void CloseAllToolStripMenuItem_Click( object sender, EventArgs e) { foreach (Form childForm in MdiChildren) { childForm.Close(); } }

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]