Hierarquias de herança profundas, ou o uso inadequado da herança, podem levar a um código difícil de manter, dificultando o entendimento das relações entre as classes ou extensão delas sem causar interrupção.
O Copilot Chat pode sugerir refatorar designs baseados em herança para gerar designs mais flexíveis baseados em composição (favorecendo a composição em vez da herança). Ele também pode recomendar a aplicação de padrões como Estratégia ou Decorador para tornar o sistema mais extensível sem adicionar complexidade à estrutura de herança.
Cenário de exemplo
O código C# a seguir tem uma hierarquia de herança profunda em que cada classe se baseia na anterior. O resultado é uma cadeia de herança longa que dificulta saber quais propriedades cada classe tem.
Uma hierarquia de herança de vários níveis como essa pode ser difícil de entender, modificar e estender.
public class Employee
{
public string Name { get; set; }
public int EmployeeID { get; set; }
}
public class Manager : Employee
{
public int NumberOfTeams { get; set; }
}
public class SeniorManager : Manager
{
public string Region { get; set; }
}
public class Director : SeniorManager
{
public int NumberOfDepartments { get; set; }
}
public class VicePresident : Director
{
public string Division { get; set; }
}
public class President : VicePresident
{
public string Company { get; set; }
}
Solicitação de exemplo
Nessa situação, você pode decidir usar uma classe Employee
pai cujas propriedades outras classes devem herdar, mas evitar qualquer outra herança definindo todas as outras propriedades separadamente para cada classe.
Refactor 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.
Exemplo de resposta
Note
A resposta a seguir é um exemplo. Respostas do Copilot Chat são não determinísticas, portanto, você pode obter uma resposta diferente da mostrada aqui.
O Copilot sugere o seguinte código:
public class Employee
{
public string Name { get; set; }
public int EmployeeID { get; set; }
}
public class Manager : Employee
{
public int NumberOfTeams { get; set; }
}
public class SeniorManager : Employee
{
public int NumberOfTeams { get; set; }
public string Region { get; set; }
}
public class Director : Employee
{
public int NumberOfTeams { get; set; }
public string Region { get; set; }
public int NumberOfDepartments { get; set; }
}
public class VicePresident : Employee
{
public int NumberOfTeams { get; set; }
public string Region { get; set; }
public int NumberOfDepartments { get; set; }
public string Division { get; set; }
}
public class President : Employee
{
public int NumberOfTeams { get; set; }
public string Region { get; set; }
public int NumberOfDepartments { get; set; }
public string Division { get; set; }
public string Company { get; set; }
}