/
IVEinzelstreife
/
ProgrammerResume
Обзор
Документация
Войти
/
IVEinzelstreife
/
ProgrammerResume
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Models/Programmer.cs
160 строк
7 KB
Илья Куракин
30.06.2026 16:26
30 июн 2026, 16:26
Верифицирован
30 июн 2026, 16:26
2879c0d
Код
Авторство
О чём код?
/*======================================= НАСЛЕДОВАННЫЙ КЛАСС (Derived Class) - Programmer ======================================== Класс-наследник Programmer получит все свойства и методы абстрактного класса Person, при этом добавит свою сигнатуру для выполнения конкретных задач. Преимущества наследования - Повторное использование кода (не нужно создавать уже ранее записанные конструкции); - Сохранение логической структуры программы; - Возможность использования принципа полиморфизма (использование класса Programmer там, где ожидается класс Person). ПОЛИМОРФИЗМ - это принцип ООП, обеспечивающий способность объектов с разной внутренней структурой одинаково реагировать на одни и те же запросы. */ using ProgrammerResume.Models.Enums; using ProgrammerResume.Models.Interfaces; namespace ProgrammerResume.Models { // Класс-наследник Programmer получит все свойства и методы абстрактного класса Person, и при этом добавит к списку абстрактных свойств собственные свойства - навыки, проекты, опыт работы, специализация. public class Programmer : Person { /* ---- Конструктор класса-наследника ---- Ключевое слово: base(...) - вызывает конструктор родительского класса. Порядок вызова: 1) Вызывается конструктор Person(base) 2) Выполняется код конструктора Programmer */ public Programmer(string firstName, string lastName, DateTime birthDate) : base(firstName, lastName, birthDate) { // Инициализация коллекций (создание пустых списков в конструкторе) Skills = new List<Skill>(); Projects = new List<Project>(); ExperienceHistory = new List<WorkExperience>(); EducationHistory = new List<Education>(); } public Programmer() : base() { Skills = new List<Skill>(); Projects = new List<Project>(); ExperienceHistory = new List<WorkExperience>(); EducationHistory = new List<Education>(); } // Собственные свойства: // Специализация public string Specialization { get; set; } = "Full-Stack разработчик"; // Стаж работы (по специальности) public int YearsOfExperience { get; set; } // Cсылка на профиль в GitHub public string GitHubProfile { get; set; } // Cсылка на собственный Web-ресурс public string PersonalWeb { get; set; } // Секция "О себе" public string? AboutMe { get; set; } // Ожидаемая зарплата public decimal? ExpectedSalary { get; set; } // Готовность к переезду public bool IsOpenRelocation { get; set; } // Готовность к удаленной работе public bool IsOpenToRemote { get; set; } = true; // ------ Коллекции ------ public List<Skill> Skills { get; set; } public List<Project> Projects { get; set; } public List<WorkExperience> ExperienceHistory { get; set; } public List<Education> EducationHistory { get; set; } // ------ Методы ------ public void AddSkill(Skill skill) { if (skill == null) throw new ArgumentNullException(nameof(skill), "Навык не дожен быть пустым!"); Skills.Add(skill); } public void AddProject(Project project) { if (project == null) throw new ArgumentNullException(nameof(skill), "Проет не дожен быть пустым!"); Skills.Add(project); } public IEnumerable<Skill> GetTopSkills() { return Skills .Where(s => s.level >= SkillLevel.Senior) .OrderByDescending (s => s.Level) .ThenBy(s => s.Name); } public int GetTotalProjectsCount() { return Projects.Count; } public double GetTotalExperienceYears() { double totalMonths = 0; foreach (var experience in ExperienceHistory) { var endDate = experience.EndDate ?? DateTime.Now; var months = (endDate.Year - experience.StartDate.Year) *12 + (endDate.Month - experience.StartDate.Month); totalMonths += Math.Max(0, months); } return totalMonths / 12.0; } // ------ Переопределение методов ------ public override string GetProfessionalRole() { return $"Я {Specialization} с опытом {YearsOfExperience} лет." + $"Владею {Skills.Count} технологиями."; } public override string Introduce() { var baseInfo = base.Introduce(); var techInfo = $"Мои основные технологии: " + $"{string.Join(", ", GetTopSkills().Take(5).Select(s => s.Name))}"; return $"{baseInfo} {techInfo}"; } public override string GetSummary() { return $"{base.GetSummary()} | " + $"Специализация: {Specialization} |" + $"Проектов: {GetTotalProjectsCount()} |" + $"Навыков: {Skills.Count}"; } public new IEnumerable<string> GetValidationErrors() { var baseErrors = base.GetValidationErrors(); var programmerErrors = new List<string>(baseErrors); if (YearsOfExperience < 0) programmerErrors.Add("Стаж работы не может быть отрицательным"); if (YearsOfExperience > Age - 14) programmerErrors.Add("Стаж работы превышает реалистичные значения"); if (Skills.Count == 0) programmerErrors.Add("Нужно указать хотя бы один навык"); return programmerErrors; } // ------ Перегрузка методов ------ public void AddSkill(string name, SkillLevel level, string category) { var skill = new Skill(name, level, category); AddSkill(skill); } public void AddSkill(string name, SkillLevel level) { AddSkill(name, level, "Общие"); } } }