{"meta":{"title":"Упрощение сложных иерархий наследования","intro":"Copilot Chat Это поможет вам рефакторить код, чтобы избежать классов с несколькими слоями наследования.","product":"GitHub Copilot","breadcrumbs":[{"href":"/ru/copilot","title":"GitHub Copilot"},{"href":"/ru/copilot/tutorials","title":"Учебники"},{"href":"/ru/copilot/tutorials/copilot-cookbook","title":"Кулинарная книга GitHub Copilot"},{"href":"/ru/copilot/tutorials/copilot-cookbook/refactor-code","title":"Код рефакторинга"},{"href":"/ru/copilot/tutorials/copilot-cookbook/refactor-code/simplify-inheritance-hierarchies","title":"Упрощение иерархий наследования"}],"documentType":"article"},"body":"# Упрощение сложных иерархий наследования\n\nCopilot Chat Это поможет вам рефакторить код, чтобы избежать классов с несколькими слоями наследования.\n\nГлубокие иерархии наследования или неправильное использование наследования могут привести к коду, который трудно поддерживать, что затрудняет выполнение связей между классами или расширение их без возникновения разрыва.\n\nCopilot Chat могу предложить рефакторинг дизайнов, основанных на наследовании, в более гибкие композиционные конструкции (с предпочтением композиции над наследованием). Кроме того, рекомендуется применять такие шаблоны, как Стратегия или Декоратор, чтобы сделать систему более расширяемой, не добавляя сложности в структуру наследования.\n\n## Пример сценария\n\nСледующий код C# имеет глубокую иерархию наследования, где каждый класс строится на предыдущем. Результатом является длинная цепочка наследования, которая затрудняет знание свойств каждого класса.\n\nИерархия наследования нескольких уровней может быть сложной для понимания, изменения и расширения.\n\n```csharp id=employee-class\npublic class Employee\n{\n    public string Name { get; set; }\n    public int EmployeeID { get; set; }\n}\n\npublic class Manager : Employee\n{\n    public int NumberOfTeams { get; set; }\n}\n\npublic class SeniorManager : Manager\n{\n    public string Region { get; set; }\n}\n\npublic class Director : SeniorManager\n{\n    public int NumberOfDepartments { get; set; }\n}\n\npublic class VicePresident : Director\n{\n    public string Division { get; set; }\n}\n\npublic class President : VicePresident\n{\n    public string Company { get; set; }\n}\n```\n\n## Пример запроса\n\nВ этой ситуации можно использовать родительский `Employee` класс, свойства которого другие классы должны наследовать, но чтобы избежать любого другого наследования, определив все остальные свойства отдельно для каждого класса.\n\n```copilot copy prompt ref=employee-class\nRefactor this code so that classes only inherit the properties of the Employee class. All of the other properties that each class currently inherits should instead be declared independently in each class definition.\n```\n\n## Пример ответа\n\n> \\[!NOTE] Следующий ответ является примером. Ответы Copilot Chat являются недетерминированными, поэтому вы можете получить другой ответ, показанный здесь.\n\nCopilot Предполагает следующий код:\n\n```csharp\npublic class Employee\n{\n    public string Name { get; set; }\n    public int EmployeeID { get; set; }\n}\n\npublic class Manager : Employee\n{\n    public int NumberOfTeams { get; set; }\n}\n\npublic class SeniorManager : Employee\n{\n    public int NumberOfTeams { get; set; }\n    public string Region { get; set; }\n}\n\npublic class Director : Employee\n{\n    public int NumberOfTeams { get; set; }\n    public string Region { get; set; }\n    public int NumberOfDepartments { get; set; }\n}\n\npublic class VicePresident : Employee\n{\n    public int NumberOfTeams { get; set; }\n    public string Region { get; set; }\n    public int NumberOfDepartments { get; set; }\n    public string Division { get; set; }\n}\n\npublic class President : Employee\n{\n    public int NumberOfTeams { get; set; }\n    public string Region { get; set; }\n    public int NumberOfDepartments { get; set; }\n    public string Division { get; set; }\n    public string Company { get; set; }\n}\n```\n\n## Дополнительные материалы\n\n* [Инженерия подсказок для GitHub Copilot Chat](/ru/copilot/concepts/prompting/prompt-engineering)\n* [Лучшие практики использования GitHub Copilot](/ru/copilot/get-started/best-practices)"}