51471

Отношения между классами. Интерфейсы, делегаты и события

Лекция

Информатика, кибернетика и программирование

Отношения между классами. Понятие отношения между классами. Классы с событиями. Обработчик события: всегда принадлежит классу зажигающему событие; никогда не принадлежит классу зажигающему событие; может принадлежать классу зажигающему событие; принадлежит только одному классу слушающему событие; может принадлежать многим классам слушающим события. Отметьте истинные высказывания: все события имеют одинаковую сигнатуру из двух аргументов с одними и теми же типами; все события имеют сигнатуру из двух аргументов но с...

Русский

2014-02-11

40.52 KB

8 чел.

Тема 5.4. Отношения между классами.
Интерфейсы, делегаты и события

5.4.1. Понятие отношения между классами

5.4.2. Отношение вложенности

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

5.4.3. Статический контроль типов и динамическое связывание

5.4.4. Пример работы с полиморфным семейством классов

5.4.5. Абстрактные классы

5 .4.6. Интерфейсы

5.4.7. Проблемы множественного наследования

5.4.8. Встроенные интерфейсы

5. 5.1.  Как определяется функциональный тип, и как появляются его экземпляры

5.5.2. Функции высших порядков

5.5.3. Наследование и полиморфизм – альтернатива обратному вызову

5.5.4. Делегаты как свойства

5.5.5. Операции над делегатами. Класс Delegate

Пример «Комбинирование делегатов»

5.5.6. Классы с событиями

Вариант 1

Обработчик события:

всегда принадлежит классу, зажигающему событие;

никогда не принадлежит классу, зажигающему событие;

может принадлежать классу, зажигающему событие;

принадлежит только одному классу, слушающему событие;

может принадлежать многим классам, слушающим события.

Отметьте истинные высказывания:

все события имеют одинаковую сигнатуру из двух аргументов с одними и теми же типами;

все события имеют сигнатуру из двух аргументов, но с отличающимися типами;

все события, не имеющие собственных аргументов, передаваемых обработчику, соответствуют стандартному встроенному делегату EventHandler;

для класса с большим числом событий целесообразно применять динамическое связывание;

для связывания событий с обработчиком можно применять только операцию +=.

Объявление события в классе может представлять собой:

объявление метода класса;

объявление поля класса;

объявление процедуры-свойства класса с методами get и set;

объявление процедуры-свойства класса с методами add и remove.

Вариант 2

Объекты одного класса:

имеют одинаковый набор событий;

в процессе вычислений зажигают одинаковый набор событий;

в процессе вычислений зажигают набор событий, характерный для объекта;

в разных сеансах работы зажигают одинаковый набор событий;

в разных сеансах работы зажигают разные события.

Отметьте истинные высказывания:

класс, обрабатывающий событие, может отсоединить других обработчиков события и полностью определить реакцию на событие;

каждый объект определяет, какой обработчик присоединяется к событию;

метод GetInvocationList не применим к событиям;

все события имеют одну и ту же сигнатуру.

Класс EventHandler:

является классом, которому принадлежат все события;

является абстрактным классом и не может иметь экземпляров;

является родительским классом для событий, не имеющих собственных аргументов;

является потомком класса Delegate;

накладывает ограничения на сигнатуру события.

Вариант 3

Процедура, в которой зажигается событие:

передает обработчику событий входные аргументы и продолжает свою работу;

передает обработчику событий входные аргументы и ждет окончания работы первого обработчика, связанного с событием;

передает обработчику событий входные аргументы и ждет окончания работы всего списка обработчиков, связанного с событием;

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

Отметьте истинные высказывания:

события – это специализированный вариант делегатов;

к каждому событию должен быть присоединен хотя бы один обработчик события;

методы Combine и Remove, наследованные от класса Delegate не применимы к событиям;

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

Все аргументы события принадлежат:

классу EventArgs;

классу EventArgs, за исключением аргумента, задающего объект, зажигающий событие;

потомку класса EventArgs;

потомку класса EventArgs за исключением аргумента, задающего объект, зажигающий событие;

возможно разным классам.


Вариант 1

Отметьте корректные объявления делегата – функционального класса:

public class D = delegate void(string s);

Delegate D1 = new Delegate( void(string s);

public delegate void D2 (string s);

delegate int T(int x1, ref int x2);

public delegate T1(int x);

Отметьте истинные высказывания:

каждый объявленный функциональный класс является наследником класса Delgate;

сигнатура метода, связываемого с экземпляром делегата, в точности совпадает с сигнатурой, определенной делегатом;

один из аргументов функции высшего порядка является экземпляром делегата;

для делегатов определена операция вычитания;

определение делегата эквивалентно определению указателя на функцию.

Функция обратного вызова – это:

функция, прямо или косвенно вызывающая саму себя;

функция f, вызывающая функцию g, переданную ей в качестве одного из аргументов, c сигнатурой, удовлетворяющей контракту, заданному функцией f;

пара функций, взаимно вызывающих друг друга;

функция высшего порядка.

Вариант 2

Дано объявление делегата:  public delegate double D (double x); Какие объявления его экземпляров будут корректны в определенном контексте:

D d1 = new D(Math.sin);

D d2 = new D(double f(double x){return x+1;};

D d3 = new D(x.f1);

D d4 = new D(Person.f2);

D d5 = new D(f3);

Отметьте истинные высказывания:

каждый экземпляр делегата обладает методом GetInvocationList;

над делегатами определена операция умножения *;

при вызове метода, связанного с экземпляром делегата, могут выполняться методы других экземпляров;

язык C# позволяет построить делегата непосредственным наследованием от абстрактного класса Delegate;

Класс Delegate не определен в библиотеке FCL.

Реализация экземпляра делегата в виде процедуры

позволяет скрыть его от клиента;

иметь один экземпляр вместо нескольких;

динамически связывать экземпляр с методом;

экономить память.

Вариант 3

Что мощнее наследование или функциональный тип?

наследование позволяет промоделировать механизм функций высших порядков;

функциональный тип позволяет моделировать наследование;

виртуальные методы и функции высших порядков основаны на контракте;

оба механизма дополняют друг друга;

эти механизмы не имеют ничего общего.

Отметьте истинные высказывания:

делегаты являются наследниками интерфейса ICloneable;

делегаты являются наследниками интерфейса ISerializable;

операции + и – изменяют приоритет делегата;

метод Combine возвращает в качестве результата объект того же типа, что и экземпляр делегата, вызвавшего метод.

Какие методы делегатов являются статическими:

Combine;

Clone;

CreateDelegate;

GetInvocationList;

GetHashCode.


Вариант 1

Ключевое слово interface в языке C# задает описание:

пользовательского интерфейса класса;

открытой части класса;

частного случая класса;

абстрактного класса.

Отметьте истинные высказывания:

слово «интерфейс» имеет разный смысл в зависимости от контекста;

множественное наследование интерфейсов дает те же возможности, что и множественное наследование классов;

при наследовании интерфейса ICloneable необходимо реализовать метод MemberwiseClone;

при наследовании двух интерфейсов имена их методов должны быть различными;

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

Интерфейс ISerializable:

автоматически реализует глубокую сериализацию;

позволяет управлять процессом сериализации;

имеет два метода, которые должен реализовать класс, наследующий интерфейс;

конфликтует с атрибутом класса Serializable.

Вариант 2

Пусть задано описание интерфейсов: interface IN{string M(string s);} interface IP{string M(string s); string M1(int s);} interface IQ{int M(int s);}. Какие из объявлений классов содержат ошибки:

public class C1:IP{string IP.M(string s){return (s+s);}
string IP.M1(int x){return x.ToString();}public int M (int s) { return s++;}}

public class C1:IP,IN{string IP.M(string s){return (s+s);}
string IP.M1(int x){return x.ToString();}}

public class C1:IP,IN{public string M(string s){return (s+s);}
public string M1(int x){return x.ToString();}}

public class C1:IP,IN,IQ{public string M(string s){return (s+s);}
public string M1(int x){return x.ToString();}}

Отметьте истинные высказывания:

для того чтобы объекты собственного класса сравнивать на «больше» и «меньше», необходимо сделать класс наследником интерфейса IComparable;

для того чтобы объекты собственного класса можно было клонировать, необходимо сделать класс наследником интерфейса ICloneable;

для того чтобы объекты собственного класса можно было сериализовать, необходимо сделать класс наследником интерфейса ISerializable;

методы разных интерфейсов с одинаковой сигнатурой можно «склеивать» в классе наследнике, назначая им одну реализацию;

реализация метода Clone позволяет организовать глубокое клонирование.

Класс с атрибутом Serialize:

должен быть наследником интерфейса ISerializable;

при вызове форматером метода Serialize выполняет глубокую сериализацию, если класс не является наследником интерфейса ISerializable;

допускает два формата сериализации данных;

облегчает организацию обмена данными с удаленным приложением;

позволяет сохранять данные в текстовом формате.

Вариант 3

Пусть задано описание интерфейса и класса: interface IP{string M(string s); string M1(int s);} public class C1:IP{string IP.M(string s){return (s+s);}
string IP.M1(int x){return x.ToString();}public int M (int s) { return (s++);}}
Какие из объявлений в клиентском классе выполнимы:

C1 it1 = new C1(); it1.M(7777);

C1 it2 = new C1(); string s ="ss"; s =it2.IP.M(s);

C1 it3 = new C1(); string s ="ss"; s =((IP)it3).M(s);

IP it4 = new IP(); string s= "ss"; s = it4.M(s);

IP it5 = (IP) new C1(); string s= "ss"; s = it5.M(s);

Отметьте истинные высказывания:

один класс может наследовать несколько интерфейсов;

один интерфейс может наследоваться несколькими классами;

из-за коллизии имен дублируемое наследование интерфейсов запрещено;

интерфейс может быть наследником нескольких интерфейсов;

класс с атрибутом ISerializable должен реализовать специальный защищенный конструктор.

При наследовании интерфейсов:

класс наследник должен реализовать хотя бы один из его методов;

может выполнить переименование методов интерфейса;

может выполнить склейку методов с одинаковой сигнатурой;

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

объекту интерфейсного типа доступны закрытые методы интерфейса, реализованные в классе;

объекты интерфейсного типа создаются стандартным путем с помощью контсруктора.


Вариант 1

Для классов клиентов и поставщиков справедливы утверждения:

у класса поставщика может быть много клиентов;

у класса клиента может быть много поставщиков;

поставщик может быть собственным поставщиком;

клиент может быть собственным клиентом;

отношение «клиент-поставщик» – задает отношение «имеет»;

отношение «клиент-поставщик» – задает отношение «является».

Отметьте истинные высказывания:

класс называется абстрактным, если он не вводит собственных полей данных;

если в методах класса А вызываются методы класса В, то это означает, что класс А является клиентом класса В;

у класса может быть несколько непосредственных родительских классов;

у класса может быть только один непосредственный потомок;

в проектах на C# контроль типов выполняется на этапе компиляции.

В родительском классе описан метод public virtual void M(int x) {}. Какие объявления в классе потомке вызовут ошибку на этапе компиляции?

override void M(int x){}

public override void M(int item){}

public new void M(int x){}

public virtual void M(int x){}

public virtual void M(int x, int y){}

Вариант 2

Для классов родителей и потомков справедливы следующие утверждения:

у родительского класса может несколько непосредственных потомков;

у класса потомка может быть несколько непосредственных родительских классов;

класс родитель может быть сам себе родитель;

класс потомок может быть собственным потомком;

потомок наследует все поля и методы родителя, за исключением закрытых (private);

Отметьте истинные высказывания:

класс с модификатором sealed не может иметь потомков;

класс с модификатором abstract не может иметь потомков с таким же модификатором;

если не задан специальный модификатор, то по умолчанию применяется динамическое связывание;

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

В родительском классе описан метод public virtual void M(int x) {}. Какие объявления в классе потомке вызовут предупреждения на этапе компиляции?

override void M(int x){}

public override void M(int item){}

public new void M(int x){}

public virtual void M(int x){}

public virtual void M(int x, int y){} 2

Вариант 3

Для понятия «полиморфизм» справедливы следующие утверждения:

полиморфизм определяется для семейства классов, связанных отношением наследования;

полиморфизм определяется для семейства классов, связанных отношением вложенности;

полиморфизм означает, что в классе заданы перегруженные методы;

реализация полиморфизма построена на динамическом связывании;

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

Отметьте истинные высказывания:

вызов конструктора приводит к вызову конструкторов всех предков класса;

клиенту доступны все методы поставщика;

наследнику доступны все методы предков;

абстрактный класс может иметь полностью реализованный метод;

объект наследника «является» объектом родителя.

В родительском классе описан метод public void M(int x) {}. Какие объявления в классе потомке вызовут ошибки или предупреждения на этапе компиляции?

public override void M(int x) {}

public new void M(int x) {}

public new void M(int x, int y){}

public void M(int x){}

private new void M(int x){}


 

А также другие работы, которые могут Вас заинтересовать

36291. Понятие транзакции 38.5 KB
  Понятие транзакции. Транзакции – несколько операторов языка SQL которые либо все выполняются по очереди либо все не выполняются. Согласованность – гарантия что по мере выполнения транзакции данные переходят из одного согласованного состояния в другое.
36292. Журнализация изменений БД, файл журнала, контрольные точки 31.5 KB
  Это требование предполагает возможность восстановления согласованного состояния базы данных после любого программного или аппаратного сбоя. Типичная СУБД должна предоставлять такие функции восстановления как: механизм резервного копирования предназначенный для периодического создания копий базы данных; средства ведения журнала в котором фиксируются текущее состояние транзакций и вносимые в базы данных изменения; функция создания контрольных точек обеспечивающая перенос выполняемых в базе данных изменений во вторичную помять с целью...
36293. Восстановление базы данных 28 KB
  При этом надо устранить последствия операторов модификации базы данных которые выполнялись в этой транзакции. Ситуация характеризуется потерей той части базы данных которая к моменту сбоя содержалась в буферах оперативной памяти. Восстановление после поломки основного внешнего носителя базы данных жесткий сбой.
36294. Техническое задание. Основные разделы 36.5 KB
  Техническое задание это документ определяющий цели требования и основные исходные данные необходимые для разработки автоматизированной системы управления. требования к программе или программному изделию; требования к функциональным характеристикам; требования к составу выполняемых функций организации входных и выходных данных временным характеристикам требования к надежности; требования к обеспечению надежного функционирования обеспечения устойчивого функционирования контроль входной и выходной информации время восстановления...
36295. Состав и содержание работ на стадиях внедрения, эксплуатации и сопровождения проекта 39.5 KB
  Недостатком первого подхода является увеличение длительности внедрения что ведет за собой рост стоимости проекта. При использовании второго подхода сокращается время внедрения но возникает возможность пропуска ошибок в проектной документации поэтому чаще всего используют смешанный метод внедрения проекта ЭИС. Внедрение проекта осуществляется в течение трех этапов: подготовка объекта к внедрению; опытное внедрение; сдача проекта в промышленную эксплуатацию.
36296. САSЕ – средства, классификация 26 KB
  Аббревиатура САSЕ Соmputеrаidеd Softwre Епgineering автоматизированная разработка ПО обозначает специальный тип программного обеспечения предназначенного для поддержки отдельных этапов создания ПО таких как разработка требований проектирование кодирование и тестирование программ. Поэтому к САSЕсредствам относятся редакторы проектов словари данных компиляторы отладчики средства построения систем и т. САSЕтехнологии предлагают поддержку процесса создания ПО путем автоматизации которых этапов разработки а также создания и...
36297. Типы пользовательского интерфейса 27.5 KB
  Процедурно-ориентированный интерфейс использует традиционную модель взаимодействия с пользователем основанную на понятиях процедура и операция. Объектно-ориентированные интерфейсы используют модель взаимодействия с пользователем ориентированную на манипулирование объектами предметной области. Процедурноориентированные интерфейсы: 1Обеспечивает пользователю функции необходимые для выполнения задач; 2Акцент делается на задачи; 3Пиктограммы представляют приложения окна или операции; 4Содержание папок и справочников отражается с...
36298. Понятие рекурсии. Прямая и косвенная рекурсия 23.5 KB
  Рекурсия – это такой способ организации программы когда процедура или функция в ходе выполнения составляющих ее операторов обращается сама к себе. Примером программы с использованием рекурсии может быть программа вычисления факториала числа. Программы которые используют рекурсивные процедуры отличаются простотой наглядностью и компактностью текста. Максимальное число рекурсивных вызовов процедуры без возвратов которое происходит во время выполнения программы называется глубиной рекурсии.
36299. Работа с динамическими переменными 394 KB
  Использование идентификатора указателя в программе означает обращение к адресу ячейки памяти на которую он указывает. Выделение и освобождение памяти под динамические переменные выполняется стандартными процедурами New Dispose во время работы программы. Р В неопределенном состоянии указатель бывает в начале работы программы до первого присваивания ему или конкретного адреса или пустого адреса nil а также после освобождения области памяти на которую он указывает. b:=nil; Процедура New: выделяет область памяти соответственно тому...