- Створіть базовий клас
Person
з полямиFullName
(string
) таBirthDate
(DateTime
), базовими конструкторами з делегуванням, геттерами/сеттерами та віртуальним методомDisplayInfo()
(виводить ПІБ та дату). - Зробіть
Student
похідним відPerson
(використовуйте: Person
). Додайте конструктори з делегуванням до базового (: base(fullName, birthDate)
). - Створіть похідний клас
GraduateStudent
відStudent
з додатковим полемThesisTopic
(string
) та конструктором, що делегує доStudent
. Додайте геттер/сеттер для теми.
- Зробіть
DisplayInfo()
віртуальним уPerson
. Перевизначте (override
) його вStudent
(викликайтеbase.DisplayInfo()
+ виводьте адресу, телефон, оцінки). УGraduateStudent
— ще + тема диплома. - У
Group.DisplayStudents()
використовуйте поліморфізм: зберігайте список якList<Person>
абоPerson[]
(щоб додаватиGraduateStudent
), і викликайтеDisplayInfo()
— має працювати для всіх похідних типів динамічно.
- У
Person
перевизначтеToString()
(повний опис: ПІБ + дата). - Перевизначте
Equals(object obj)
(порівняння заFullName
+BirthDate
; використовуйтеis Person other
). - Перевизначте
GetHashCode()
(комбінований хеш черезHashCode.Combine()
). - У похідних класах (
Student
,GraduateStudent
) розширте ці методи (наприклад,Equals
додає перевірку адреси/телефону/теми). - Продемонструйте в
Group.AddStudent()
: використовуйтеContains()
(викликаєEquals
) для уникнення дублікатів.
- Створіть статичний клас
StudentExtensions
. - Додайте extension-метод
CalculateGPA(this Student student)
: обчислює середній бал усіх оцінок. - Додайте
HasPassedSession(this Student student)
: повертаєtrue
, якщо GPA >= 60. - У
Group.ExpelFailedStudents()
таExpelWorstStudent()
використовуйте ці extension-методи. - Продемонструйте в
Main
:student1.CalculateGPA()
.