Лабораторная работа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,вывестисписок публикаций,вышедших за последнийгод.