Наследование.Исключения.Интерфейсы.Итераторы и блокиитераторов




Лабораторная работа3

Классы,свойства,индексаторы.

Требованиякпрограмме,общиедлявсехвариантов

Определитькласс Person,которыйимеет

· закрытоеполе типа string,вкотором хранитсяимя;

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

· закрытоеполе типа System.DateTimeдлядаты рождения.В классе Person определить конструкторы:

· конструктор cтремяпараметрамитипаstring,string,DateTimeдля

инициализациивсехполейкласса;

· конструктор безпараметров, инициализирующийвсеполяклассанекоторымизначениямипо умолчанию.

В классе Person определить свойстваcметодамиgetиset:

· свойство типа stringдлядоступакполюсименем;

· свойство типа stringдлядоступакполюсфамилией;

· свойство типа DateTimeдлядоступакполюсдатой рождения;

· свойство типа intcметодамиgetиsetдляполученияинформации(get) иизменения(set)года рожденияв закрытом поле типаDateTime,вкоторомхранитсядата рождения.

Вклассе Person определить

· перегруженную(override)версиювиртуальногометода stringToString()дляформированиястрокисозначениямивсехполейкласса;

· виртуальныйметодstringToShortString(),которыйвозвращаетстроку,содержащуютолькоимяифамилию.


Вариант1. Требованияк программе

Определитьтип Education - перечисление(enum)созначениямиSpecialist,Вachelor,SecondEducation.

Определить класс Exam, который имеет три открытых автореализуемыхсвойства,доступныхдлячтенияи записи:

· свойство типа string,вкотором хранитсяназваниепредмета;

· свойство типа int,вкотором хранитсяоценка;

· свойство типа System.DateTimeдлядаты экзамена.

Вклассе Exam определить:

· конструктор спараметрамитипаstring,intиDateTime для инициализациивсех свойствкласса;

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

· перегруженную(override)версиювиртуальногометода stringToString()дляформированиястрокисозначениямивсех свойствкласса.

Определитькласс Student,которыйимеет

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

· закрытоеполе типа Educationдляинформациио формеобучения;

· закрытоеполе типа intдляномера группы;

· закрытоеполетипаExam*+дляинформацииобэкзаменах,которыесдалстудент.

В классе Student определить конструкторы:

· конструктор cпараметрамитипаPerson, Education,intдля инициализациисоответствующих полейкласса;

· конструктор безпараметров, инициализирующийполякласса значениямипо умолчанию.

В классе Student определить свойстваcметодамиgetиset:

· свойство типа Personдлядоступакполюсданнымистудента;

· свойство типа Educationдлядоступакполюсформойобучения;

· свойство типа intдлядоступакполюсномером группы;

· свойствотипаExam*+длядоступакполюсоспискомэкзаменов.

Вклассе Student определить

· свойствотипа double(толькосметодом get),вкотором вычисляетсясреднийбалл каксреднеезначениеоценок в спискесданных экзаменов;

· индексаторбулевскоготипа(только сметодомget)соднимпараметромтипа Education;значениеиндексатора равноtrue,если значениеполяс


формойобучениястудента совпадаетсозначениеминдекса,иfalseвпротивномслучае;

· методvoidAddExams(paramsExam[]) длядобавленияэлементов всписокэкзаменов;

· перегруженнуюверсиювиртуальногометодаstringToString()дляформированиястрокисо значениямивсех полейкласса,включаясписокэкзаменов;

· виртуальныйметодstringToShortString(), которыйформируетстрокусозначениямивсех полейклассабез списка экзаменов, но созначениемсреднегобалла.

Вметоде Main()

1. СоздатьодинобъекттипаStudent,преобразоватьданныевтекстовыйвидспомощьюметода ToShortString()ивывестиданные.

2. ВывестизначенияиндексаторадлязначенийиндексаEducation.Specialist,Education.Bachelor иEducation.SecondEducation.

3. ПрисвоитьзначениявсемопределеннымвтипеStudentсвойствам,преобразоватьданныевтекстовыйвидспомощьюметодаToString()ивывестиданные.

4. CпомощьюметодаAddExams(paramsExam*+)добавитьэлементывсписокэкзаменовивывестиданныеобъектаStudent,используяметодToString().

5. Сравнитьвремявыполненияопераций с элементамиодномерного,двумерногопрямоугольногоидвумерногоступенчатогомассивовсодинаковым числомэлементовтипа Exam.

 

 

Вариант2.Требованияк программе

Определитьтип Frequency- перечисление(enum)созначениямиWeekly,Monthly,Yearly.

Определитькласс Article,которыйимееттриоткрытыхавтореализуемыхсвойства,доступныхдлячтенияи записи:

· свойство типа Person,вкотором хранятсяданныеавторастатьи;

· свойство типа stringдляназваниястатьи;

· свойство типа doubleдлярейтинга статьи.

Вклассе Article определить:

· конструктор cпараметрамитипаPerson,string,doubleдляинициализациивсех свойствкласса;


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

· перегруженную(override)версиювиртуальногометода stringToString()дляформированиястрокисозначениямивсех свойствкласса.

Определитькласс Magazine,которыйимеет

· закрытоеполе типа stringcназваниемжурнала;

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

· закрытоеполе типа DateTimecдатой выходажурнала;

· закрытоеполе типа intстиражомжурнала;

· закрытоеполетипаArticle*+соспискомстатейвжурнале.

В классе Magazine определить конструкторы:

· конструктор спараметрамитипаstring,Frequency,DateTime,intдляинициализациисоответствующих полейкласса;

· конструктор безпараметров, инициализирующийполякласса значениямипо умолчанию.

В классе Magazine определить свойстваcметодамиgetи set:

· свойство типа stringдлядоступакполюсназваниемжурнала;

· свойство типа Frequencyдлядоступак полюсинформациейопериодичностивыхода журнала;

· свойство типа DateTimeдлядоступакполюcдатой выхода журнала;

· свойство типа intдлядоступакполюстиражомжурнала;

· свойствотипаArticle*+длядоступакполюсоспискомстатей.

Вклассе Magazine определить

· свойствотипа double(толькосметодом get),вкотором вычисляетсясреднеезначениерейтинга в списке статей;

· индексаторбулевскоготипа(только сметодомget)соднимпараметромтипа Frequency;значениеиндексатора равноtrue,если значениеполятипаFrequency совпадаетсозначением индекса,иfalseвпротивном случае;

· методvoidAddArticles (paramsArticle[])длядобавленияэлементов всписокстатей в журнале;

· перегруженнуюверсиювиртуальногометодаstringToString()дляформированиястрокисозначениямивсех полейкласса,включаясписокстатей;

· виртуальныйметодstringToShortString(), которыйформируетстрокусозначениямивсех полейклассабез списка статей, но созначениемсреднегорейтинга статей.

Вметоде Main()


1. СоздатьодинобъекттипаMagazine,преобразоватьданныевтекстовыйвидспомощьюметода ToShortString()ивывестиданные.

2. ВывестизначенияиндексаторадлязначенийиндексаFrequency.Weekly,Frequency.MonthlyиFrequency.Yearly.

3. ПрисвоитьзначениявсемопределеннымвтипеMagazineсвойствам,преобразоватьданныевтекстовыйвидспомощьюметодаToString()ивывестиданные.

4. CпомощьюметодаAddArticles(paramsArticle*+)добавитьэлементывсписокстатейивывестиданныеобъектаMagazine,используяметодToString().

5. Сравнитьвремявыполненияопераций с элементамиодномерного,двумерногопрямоугольногоидвумерногоступенчатогомассивовсодинаковым числомэлементов типаArticle.

 

 

Вариант3.Требованияк программе

Определитьтип TimeFrame - перечисление(enum)созначениямиYear,TwoYears,Long.

Определитькласс Paper,которыйимееттриоткрытыхавтореализуемыхсвойства,доступныхдлячтенияи записи:

· свойство типа string,вкотором хранитсяназваниепубликации;

· свойство типа Personдляавторапубликации;

· свойство типа DateTimecдатой публикации.

Вклассе Paper определить

· конструктор cпараметрамитипа string,Person,DateTimeдляинициализациивсех свойствкласса;

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

· перегруженную(override)версиювиртуальногометода stringToString()дляформированиястрокисозначениямивсехполейкласса.

Определитькласс ResearchTeam,которыйимеет

· закрытоеполе типа stringcназваниемтемы исследований;

· закрытоеполе типа stringсназваниеморганизации;

· закрытоеполе типа int–регистрационныйномер;

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

· закрытоеполетипаPaper*+,вкоторомхранитсясписокпубликаций.


В классе ResearchTeam определить конструкторы:

· конструктор cпараметрамитипаstring,string,int,TimeFrameдляинициализациисоответствующих полейкласса;

· конструктор безпараметров, инициализирующийполякласса значениямипо умолчанию.

В классе ResearchTeam определить свойства cметодамиgetиset:

· свойство типа stringдлядоступакполюсназваниемтемы исследований;

· свойство типа stringдлядоступакполюсназваниеморганизации;

· свойство типа intдлядоступакполюсномером регистрации;

· свойство типа TimeFrameдлядоступак полюспродолжительностьюисследований;

· свойствотипаPaper*+длядоступакполюсоспискомпубликацийпотемеисследований.

Вклассе ResearchTeam определить

· свойствотипа Paper(толькосметодом get),котороевозвращаетссылкунапубликациюссамойпозднейдатой выхода;если список публикацийпустой,свойство возвращаетзначение null;

· индексаторбулевскоготипа(только сметодомget)соднимпараметромтипа TimeFrame;значениеиндексатора равноtrue,если значениеполясинформациейо продолжительностиисследованийсовпадаетсозначениеминдекса,иfalseв противномслучае;

· методvoidAddPapers(paramsPaper[]) длядобавленияэлементов всписокпубликаций;

· перегруженнуюверсиювиртуальногометодаstringToString()дляформированиястрокисо значениямивсех полейкласса,включаясписокпубликаций;

· виртуальныйметодstringToShortString(), которыйформируетстрокусозначениямивсех полейклассабез списка публикаций.

Вметоде Main()

1. Создать один объект типа ResearchTeam, преобразовать данные втекстовыйвидспомощьюметодаToShortString()ивывести данные.

2. Вывестизначенияиндексаторадля значенийиндексаTimeFrame.Year,TimeFrame.TwoYears,TimeFrame.Long.

3. Присвоитьзначения всемопределеннымвтипеResearchTeamсвойствам,преобразоватьданныевтекстовыйвидспомощьюметодаToString()ивывестиданные.

4. СпомощьюметодаAddPapers(paramsPaper*+) добавитьэлементывсписок публикацийивывестиданныеобъектаResearchTeam.


5. Вывестизначениесвойства,котороевозвращаетссылкунапубликациюссамойпозднейдатойвыхода;

6. Сравнитьвремявыполненияопераций с элементамиодномерного,двумерногопрямоугольногоидвумерногоступенчатогомассивовсодинаковым числомэлементов типаPaper.

 

 

Лабораторная работа4

Наследование.Исключения.Интерфейсы.Итераторы и блокиитераторов

Информациядлявсехвариантов

Вклассе Person излабораторнойработы1ивклассах,дополнительноуказанных ввариантах,надо

· переопределить(override)виртуальныйметод boolEquals (objectobj);

· определитьоперации== и!=;

· переопределитьвиртуальныйметод intGetHashCode();

РеализациявиртуальногометодаboolEquals(objectobj)вклассеSystem.Objectопределяетравенствообъектовкакравенствоссылокнаобъекты.НекоторыеклассыизбазовойбиблиотекиBCLпереопределяютметодEquals().ВклассеSystem.Stringэтотметодпереопределентак,чторавнымисчитаютсястроки,которыесовпадаютпосимвольно.РеализацияметодаEquals()вструктурномтипеDateTimeравенствообъектовDateTimeопределяеткакравенство значений.

ВлабораторнойработетребуетсяпереопределитьметодEqualsтак,чтобыобъектысчиталисьравными,еслиравнывседанныеобъектов.ДляклассаPersonэтоозначает,чторавныдатырожденияипосимвольносовпадаютстрокисименемифамилией.

Определениеопераций==и!=должнобытьсогласованоспереопределеннымметодомEquals,т.е.критерии,покоторымпроверяетсяравенствообъектоввметодеEquals,должныиспользоватьсяиприпроверкеравенстваобъектов воперациях==и!=.

ПереопределениевиртуальногометодаintGetHashCode()такжедолжнобытьсогласованосоперациями==и!=.ВиртуальныйметодGetHashCode()используетсянекоторымиклассамибазовойбиблиотеки,например,коллекциями-словарями.Классыбазовойбиблиотеки,вызывающиеметодGetHashCode()изпользовательскоготипа,предполагают,чторавнымобъектамотвечаютравныезначенияхэш-кодов.Поэтомувслучае,когдаподравенствомобъектовпонимаетсясовпадениеданных(анессылок),реализацияметода


GetHashCode()должнадляобъектовс совпадающимиданнымивозвращатьравные значенияхэш-кодов.

Вклассах,указанныхввариантахлабораторнойработы,требуетсяопределитьметодobjectDeepCopy()длясозданияполнойкопииобъекта.ОпределенныевнекоторыхклассахбазовойбиблиотекиметодыClone()иCopy()создаютограниченную(shallow)копиюобъекта–прикопированииобъектакопиисоздаютсятолькодляполейструктурныхтипов,дляполейссылочныхтиповкопируютсятолькоссылки.Врезультатевограниченнойкопииобъектаполя-ссылкиуказываютнатежеобъекты,чтоивисходномобъекте.

МетодDeepCopy()долженсоздатьполныекопиивсехобъектов,ссылкинакоторыесодержатполятипа.Послесозданияполнаякопиянезависитотисходногообъекта-изменениелюбогополяилисвойстваисходногообъектанедолжноприводитькизменениюкопии.

ПриреализацииметодаDeepCopy()вклассе,которыйимеетполетипаSystem.Collections.ArrayList,следуетиметьввиду,чтоопределенныевклассеArrayListконструкторArrayList(ICollection)иметодClone()присозданиикопииколлекции,состоящейизэлементов ссылочныхтипов,копируюттолькоссылки.МетодDeepCopy()долженсоздатькак копии элементовколлекцииArrayList,так и полные копииобъектов,на которые ссылаютсяэлементыколлекции.Длятипов,содержащихколлекции,реализацияметодаDeepCopy()упрощается,еслив типахэлементовколлекцийтакжеопределитьметод

DeepCopy().

 

Вариант1. Требованияк программе

Определить интерфейс

 

InterfaceIDateAndCopy

{ objectDeepCopy();

DateTime Date{ get; set; }

}

Определитьновыеверсииклассов Exam, Person и Student излабораторнойработы1.Вклассы Exam, Person и Student добавитьреализациюинтерфейсаIDateAndCopy.Новуюверсиюкласса Student определитькаккласс,производныйоткласса Person.

Всеполяновойверсиикласса Person определитьсдоступомprotected,сохранить всесвойства,определенныев первой версиикласса.

В новой версиикласса Person дополнительно


· переопределитьметод virtialboolEquals (objectobj) иопределитьоперации==и!= так,чтобыравенство объектов типаPersonтрактовалоськаксовпадениевсех данныхобъектов,анессылок на объектыPerson;

· переопределитьвиртуальныйметод intGetHashCode();

· определить виртуальныйметод objectDeepCopy();

· реализоватьинтерфейсIDateAndCopy.

Определитькласс Test,которыйимеетдваоткрытыхавтореализуемыхсвойства,доступныхдлячтенияи записи:

· свойство типа string,вкотором хранитсяназваниепредмета;

· свойство типа bool дляинформациио том,сдан зачетилинет.

Вклассе Test определить:

· конструктор cпараметрамитипа stringиbool дляинициализациисвойствкласса;

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

· перегруженную(override)версиювиртуальногометода stringToString()дляформированиястрокисозначениямивсех свойствкласса.

Класс Student определить какпроизводныйот класса Person. Новаяверсиякласса Student имеетследующиеполя:

· закрытоеполе типа Educationдляинформациио формеобучения;

· закрытоеполе типа intдляномера группы;

· закрытоеполе типа System.Collections.ArrayList,в которомхранитсясписокзачетов(объекты типа Test);

· закрытоеполе типа System.Collections.ArrayListдляспискаэкзаменов(объекты типа Exam).

Кодследующихконструкторов,методовисвойствизстаройверсиикласса Student необходимоизменитьсучетомтого,чточастьполейклассаперемещенавбазовыйклассPerson,ивновойверсииклассаStudentсписокэкзаменовхранитсяв коллекции System.Collections.ArrayList:

· конструктор cпараметрамитипаPerson, Education,intдляинициализациисоответствующих полей класса;

· конструктор безпараметров дляинициализациипо умолчанию;

· свойство типа Person;методgetсвойствавозвращаетобъекттипаPerson,данныекоторогосовпадаютсданнымиподобъектабазовогокласса,методsetприсваиваетзначенияполямизподобъекта базовогокласса;

· свойствотипа double(толькосметодом get),вкотором вычисляетсясреднийбалл каксреднеезначениеоценок в спискесданных экзаменов;


· свойство типа System.Collections.ArrayListсметодамиget и setдлядоступакполю сосписком экзаменов;

· методvoidAddExams(paramsExam[])длядобавленияэлементов в списокэкзаменов;

· перегруженнаяверсиявиртуальногометода stringToString()дляформированиястрокисо значениямивсех полейкласса,включаясписокзачетов иэкзаменов;

· виртуальныйметодstringToShortString(), которыйформируетстрокусозначениямивсех полейклассабез списка зачетов иэкзаменов, носозначениемсреднегобалла.

Дополнительно вновой версиикласса Student

· определить перегруженнуюверсиювиртуальногометодаobjectDeepCopy();

· реализоватьинтерфейсIDateAndCopy;

· определить свойство типа intсметодамиgetиset длядоступа кполюсномеромгруппы. Вметодеsetброситьисключение,если присваиваемоезначениеменьшеилиравно100илибольше599. Присозданииобъекта-исключенияиспользовать один изопределенных в библиотекеCLRклассов-исключений,инициализировать объект-исключениеспомощьюконструктораспараметромтипаstring,в сообщениипередатьинформациюо допустимыхграницахдлязначениясвойства.

В новой версиикласса Student определить

· итератордляпоследовательногопереборавсех элементов (объектовтипаobject)из списков зачетов иэкзаменов(объединение);

· итераторcпараметром дляперебораэкзаменов(объектовтипа Exam)соценкойбольшезаданногозначения.

Вметоде Main()

1. СоздатьдваобъектатипаPersonссовпадающимиданнымиипроверить,что ссылкина объектынеравны,а объекты равны,вывести значенияхэш-кодовдляобъектов.

2. СоздатьобъекттипаStudent,добавитьэлементывсписокэкзаменовизачетов, вывестиданныеобъектаStudent.

3. Вывестизначениесвойстватипа Personдляобъекта типа Student.

4. СпомощьюметодаDeepCopy()создатьполнуюкопиюобъектаStudent.ИзменитьданныевисходномобъектеStudentивывестикопиюиисходныйобъект,полнаякопияисходногообъектадолжнаостатьсябезизменений.


5. Вблокеtry/catchприсвоитьсвойствусномеромгруппынекорректноезначение,в обработчикеисключениявывестисообщение,переданноечерезобъект-исключение.

6. Спомощьюоператораforeachдляитератора,определенноговклассеStudent,вывести список всех зачетови экзаменов.

7. Спомощьюоператораforeachдляитератораспараметром,определенноговклассеStudent,вывестисписоквсехэкзаменовсоценкойвыше3.

 

 

Дополнительноезадание:

Вклассе Student

· реализовать интерфейсSystem.Collections.IEnumerableдля перебораназванийвсех предметов (объектовтипа string),которыеестькакв спискезачетов,такивсписке экзаменов(пересечение).Дляэтого определитьвспомогательныйклассStudentEnumerator,реализующийинтерфейсSystem.Collections.IEnumerator.

· определить итератор дляпереборасданных зачетов иэкзаменов(объектовтипаobject),для этого определить метод,содержащийблокитератора ииспользующийоператор yield;сданныйэкзамен–экзамен соценкойбольше2;

· определить итератор дляпереборавсех сданных зачетов(объектовтипаTest),длякоторых сдан иэкзамен,дляэтого определить метод,содержащийблокитератора ииспользующийоператорyield.

Вметоде Main()

8. СпомощьюоператораforeachдляобъектатипаStudentвывестисписокпредметов,которыеестькакв спискезачетов, такив списке экзаменов.

9. Спомощьюоператораforeachдляитератора,определенноговклассеStudent,вывести список всех сданных зачетов исданныхэкзаменов.

10.Спомощьюоператораforeachдляитератора,определенноговклассеStudent,вывести список сданных зачетов, длякоторых сдан иэкзамен.

 

 

Вариант2.Требованияк программе

Определить интерфейс

 

InterfaceIRateAndCopy

{ doubleRating { get;}


objectDeepCopy();

}

Определитьновыеверсииклассов Person, Article и Magazine излабораторнойработы1.Класс Magazine определитькакпроизводныйоткласса Edition. Вклассы Article и Magazine добавить реализациюинтерфейсаIRateAndCopy.

В новой версиикласса Person дополнительно

· переопределитьметод virtialboolEquals (objectobj) иопределитьоперации==и!= так,чтобыравенство объектовтипаPersonтрактовалоськаксовпадениевсех данныхобъектов,анессылок на объектыPerson;

· переопределитьвиртуальныйметод intGetHashCode();

· определить виртуальныйметод objectDeepCopy().

В новой версиикласса Article дополнительно

· определить виртуальныйметод objectDeepCopy();

· реализоватьинтерфейсIRateAndCopy.

Определить класс Edition. Класс Edition имеет

· защищенное(protected)поле типа stringcназваниемиздания;

· защищенное поле типа DateTimecдатойвыхода издания;

· защищенное поле типа intстиражомиздания;

Вклассе Edition определить:

· конструктор спараметрамитипаstring,DateTime,intдля инициализациисоответствующих полейкласса;

· конструктор безпараметровдляинициализациипо умолчанию;

· свойстваcметодамиgetиsetдлядоступа кполямтипа;

· виртуальныйметодobjectDeepCopy();

· свойство типа intсметодамиgetиset длядоступакполюс тиражомиздания;в методеsetсвойства броситьисключение,если присваиваемоезначениеотрицательно. Присозданииобъекта-исключенияиспользоватьодин изопределенных в библиотекеCLRклассов-исключений,инициализировать объект-исключениеспомощьюконструктораспараметром типа string,в сообщениипередатьинформациюо допустимыхзначениях свойства.

В классе Edition переопределить(override):

· виртуальныйметодvirtialboolEquals(objectobj) иопределить операции

==и!= так,чтобыравенство объектовтипаEditionтрактовалоськаксовпадениевсех данных объектов,анессылок на объектыEdition;

· виртуальныйметодintGetHashCode();


· перегруженную версию виртуальногометода stringToString()дляформированиястрокисо значениямивсех полейкласса.

Новаяверсиякласса Magazine имеетбазовыйкласс Edition иследующиеполя:

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

· закрытоеполе типа System.Collections.ArrayList сосписком редакторовжурнала(объектовтипа Person).

· закрытоеполе типа System.Collections.ArrayList,в которомхранитсясписокстатейв журнале (объектовтипа Article).

Кодследующихконструкторов,методовисвойствизстаройверсиикласса Magazine необходимоизменитьсучетомтого,чточастьполейклассаперемещенавбазовыйклассEdition,ивновойверсииклассаMagazineдляспискастатейиспользуетсятипSystem.Collections.ArrayList:

· конструктор спараметрамитипаstring,Frequency,DateTime,intдляинициализациисоответствующих полейкласса;

· конструктор безпараметров дляинициализациипо умолчанию;

· свойствотипа double(только сметодом get),вкотором вычисляетсясреднеезначениерейтинга статейвжурнале;

· свойство типа System.Collections.ArrayListдлядоступакполю соспискомстатейв журнале;

· методvoidAddArticles (paramsArticle[])длядобавленияэлементов всписокстатей в журнале;

· перегруженнаяверсиявиртуальногометода stringToString()дляформированиястрокисозначениямивсех полейкласса,включаясписокстатейи список редакторов;

· виртуальныйметодstringToShortString(), которыйформируетстрокусозначениямивсех полейклассабез списка статей исписка редакторов, но созначениемсреднегорейтинга статей вжурнале.

Дополнительно вновой версиикласса Magazine реализовать

· свойство типа System.Collections.ArrayListдлядоступакспискуредакторовжурнала;

· методvoidAddEditors (paramsPerson[])длядобавленияэлементов всписокредакторов;

· перегруженную(override)версиювиртуальногометода objectDeepCopy();

· интерфейсIRateAndCopy;

· свойство типа Edition;методgetсвойствавозвращаетобъекттипаEdition,данныекоторогосовпадаютсданнымиподобъектабазовогокласса,методsetприсваиваетзначенияполямизподобъекта базовогокласса.


В новой версиикласса Magazine определить

· итератор с параметромтипа doubleдля переборастатей с рейтингомбольшенекоторогозаданногозначения;

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

Вметоде Main()

1. СоздатьдваобъектатипаEditionссовпадающимиданнымиипроверить,что ссылкина объектынеравны,а объекты равны,вывести значенияхэш-кодовдляобъектов.

2. Вблокеtry/catchприсвоитьсвойствустиражомизданиянекорректноезначение,в обработчикеисключениявывестисообщение,переданноечерезобъект-исключение.

3. СоздатьобъекттипаMagazine,добавитьэлементывспискистатейиредакторовжурнала ивывестиданныеобъектаMagazine.

4. ВывестизначениесвойстватипаEditionдляобъекта типа Magazine.

5. СпомощьюметодаDeepCopy()создатьполнуюкопиюобъектаMagazine.ИзменитьданныевисходномобъектеMagazineивывестикопиюиисходныйобъект,полнаякопияисходногообъектадолжнаостатьсябезизменений.

6. Спомощьюоператораforeachдляитератораспараметромтипаdoubleвывестисписоквсехстатейсрейтингомбольшенекоторогозаданногозначения.

7. Спомощьюоператораforeachдляитератораспараметромтипаstringвывестисписок статей,в названиикоторых естьзаданнаястрока.

 

 

Дополнительноезадание:

Вклассе Magazine

· реализовать интерфейсSystem.Collections.IEnumerableдля перебора

статей(объектовтипаArticle),авторы которыхневходятв списокредакторовжурнала;дляэтого определитьвспомогательныйкласс MagazineEnumerator,реализующийинтерфейсSystem.Collections.IEnumerator.

· определить итератор дляпереборастатей(объектовтипаArticle),авторыкоторых являютсяредакторамижурнала, дляэтого определить метод,содержащийблокитератора ииспользующийоператорyield.


· определить итератор дляперебораредакторовжурнала(объектов типаPerson),укоторых нетстатей в журнале,дляэтого определить метод,содержащийблокитератора ииспользующийоператорyield.

Вметоде Main()

8. СпомощьюоператораforeachдляобъектатипаMagazineвывестисписокстатей,авторы которых неявляютсяредакторамижурнала.

9. Спомощьюоператораforeachдляитератора,определенноговклассеMagazine,вывестисписокстатей,авторыкоторыхявляютсяредакторамижурнала.

10.Спомощьюоператораforeachдляитератора,определенноговклассеMagazine,вывестисписок редакторов, укоторых нетстатей в журнале.

 

 

Вариант3. Требованияк программе

Определить интерфейс

 

InterfaceINameAndCopy

{ string Name { get; set;}object DeepCopy();

}

Определитьновыеверсииклассов Person, Paper и ResearchTeam излабораторнойработы1.Класс ResearchTeam определитькакпроизводныйоткласса Team. Вклассы Team и ResearchTeam добавитьреализациюинтерфейсаINameAndCopy.

В классе Paper определитьвиртуальныйметод objectDeepCopy().В новой версиикласса Person дополнительно

· переопределитьметод virtialboolEquals (objectobj) иопределитьоперации==и!= так,чтобыравенство объектовтипаPersonтрактовалоськаксовпадениевсех данныхобъектов,анессылок на объектыPerson;

· переопределитьвиртуальныйметод intGetHashCode();

· определить виртуальныйметод objectDeepCopy().

Определить класс Team. Класс Team имеет

· защищенное (protected)поле типа stringсназваниеморганизации;

· защищенноеполе типаint–регистрационный номер.

Вклассе Team определить:

· конструктор спараметрамитипаstringиintдля инициализацииполейкласса;


· конструктор безпараметровдляинициализациипо умолчанию;

· свойствотипа stringдлядоступакполюсназваниеморганизации;

· свойство типа intдлядоступакполю сномером регистрации;в методеsetброситьисключение,если присваиваемое значение меньшеилиравно 0;присозданииобъекта-исключенияиспользоватьодин изопределенных вбиблиотекеCLRклассов-исключений,инициализировать объект-исключениеспомощьюконструктораспараметромтипа string.

Вклассе Team

· определить виртуальныйметод objectDeepCopy();

· реализоватьинтерфейсINameAndCopy.

В классе Team переопределить (override):

· виртуальныйметодvirtialboolEquals(objectobj) иопределить операции

==и!= так,чтобыравенство объектовтипаTeamтрактовалось каксовпадениевсех данных объектов,анессылок на объектыTeam;

· виртуальныйметодintGetHashCode();

· виртуальныйметодstringToString()для формированиястрокисозначениямивсех полейкласса.

Новаяверсиякласса ResearchTeam имеетбазовыйкласс Team иследующиеполя:

· закрытоеполе типа stringcназваниемтемы исследований;

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

· закрытоеполе типа System.Collections.ArrayList сосписком участниковпроекта (объектовтипаPerson);

· закрытоеполе типа System.Collections.ArrayListдляспискапубликаций(объектовтипаPaper).

Кодследующихконструкторов,методовисвойствизстаройверсиикласса ResearchTeam необходимоизменитьсучетомтого,чточастьполейклассаперемещенавбазовыйкласс Team,ивновойверсииклассаResearchTeamдляспискапубликаций используетсятипSystem.Collections.ArrayList:

· конструктор cпараметрамитипаstring,string,int,TimeFrameдляинициализациисоответствующих полейкласса;

· конструктор безпараметровдляинициализациипо умолчанию;

· свойство типа System.Collections.ArrayListдлядоступакполюсоспискомпубликаций;

· свойство типа Paper(только сметодом get),котороевозвращаетссылкунапубликациюссамойпозднейдатой выхода;если список публикацийпустой,свойство возвращаетзначение null;


· методvoidAddPapers(paramsPaper*+)длядобавленияэлементоввсписок публикаций;

· перегруженнаяверсиявиртуальногометодаstringToString()дляформированиястрокисозначениямивсехполейкласса,включаясписокпубликацийисписок участниковпроекта;

· методstringToShortString(),которыйформируетстроку созначениямивсехполейкласса безспискапубликацийи спискаучастниковпроекта.

Дополнительно вновой версиикласса ResearchTeam определить

· перегруженнуюверсиювиртуальногометодаobjectDeepCopy();

· свойство типа System.Collections.ArrayListдлядоступакполю соспискомучастниковпроекта;

· методvoidAddMembers(paramsPerson[])для добавленияэлементов всписокучастников проекта;

· свойство типа Team;методgetсвойствавозвращаетобъекттипаTeam,данныекоторогосовпадаютсданнымиподобъектабазовогокласса,методsetприсваиваетзначенияполямизподобъекта базовогокласса;

· реализоватьинтерфейсINameAndCopy.

В новой версиикласса ResearchTeam определить

· итератордляпоследовательногоперебораучастниковпроекта(объектовтипа Person),неимеющих публикаций;

· итераторс параметромтипа intдляпереборапубликаций,вышедших запоследниеnлет,вкотором числоnпередаетсячерезпараметритератора.

Вметоде Main()

1. СоздатьдваобъектатипаTeamссовпадающимиданнымиипроверить,что ссылкина объектынеравны,а объекты равны,вывести значенияхэш-кодовдляобъектов.

2. Вблокеtry/catchприсвоитьсвойствусномеромрегистрациинекорректноезначение,вобработчикеисключениявывестисообщение,переданное черезобъект-исключение.

3. СоздатьобъекттипаResearchTeam,добавитьэлементывсписокпубликацийисписокучастниковпроектаивывестиданныеобъектаResearchTeam.

4. Вывестизначениесвойства Teamдляобъекта типа ResearchTeam.

5. СпомощьюметодаDeepCopy()создатьполнуюкопиюобъектаResearchTeam.ИзменитьданныевисходномобъектеResearchTeamивывестикопиюиисходныйобъект,полнаякопияисходногообъектадолжна остатьсябезизменений.


6. Спомощьюоператораforeachдляитератора,определенноговклассеResearchTeam,вывестисписокучастниковпроекта,которыенеимеютпубликаций.

7. Спомощьюоператораforeachдляитератораспараметром,определенноговклассеResearchTeam,вывестисписоквсехпубликаций,вышедших за последниедвагода.

 

 

Дополнительноезадание:

ВклассеResearchTeam

· реализоватьинтерфейсSystem.Collections.IEnumerableдляперебораучастниковпроекта(объектовтипа Person),укоторыхестьпубликации;дляэтогоопределитьвспомогательныйклассResearchTeamEnumerator,реализующийинтерфейсSystem.Collections.IEnumerator.

· определить итератор дляперебора участниковпроекта (объектов типаPerson),имеющих болееодной публикации,дляэтого определитьметод,содержащийблокитератора ииспользующийоператорyield.

· определить итератор дляперебора публикаций(объектовтипа Paper),вышедших запоследнийгод, дляэтого определить метод,содержащийблокитератора ииспользующийоператор yield.

Вметоде Main()

8. СпомощьюоператораforeachдляобъектатипаResearchTeamвывестисписок участниковпроекта,укоторых естьпубликации.

9. Спомощьюоператораforeachдляитератора,определенноговклассеResearchTeam,вывестисписокучастниковпроекта,имеющихболееодной публикации.

10. Cпомощьюоператораforeachдляитератора,определенноговклассеResearchTeam,вывестисписок публикаций,вышедших за последнийгод.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-11-19 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: