Umfassende Vererbungshierarchien oder eine unsachgemäße Verwendung der Vererbung können zu Code führen, der schwer zu verwalten ist, wodurch es schwierig ist, Beziehungen zwischen Klassen zu verfolgen oder sie ohne Unterbrechung zu erweitern.
Copilot Chat kann das Umgestalten von vererbungsbasierten Designs in flexiblere kompositionsbasierte Designs vorschlagen (die Komposition gegenüber der Vererbung bevorzugen). Es kann auch empfehlen, Strategie- oder Decoratormuster anzuwenden, um das System erweiterbarer zu machen, ohne dass die Vererbungsstruktur noch komplexer wird.
Beispielszenario
Der folgende C#-Code verfügt über eine umfassende Vererbungshierarchie, in der jede Klasse auf der vorherigen aufbaut. Das Ergebnis ist eine lange Vererbungskette, die es schwierig macht, zu wissen, welche Eigenschaften jede Klasse hat.
Eine solche Hierarchie mit mehreren Ebenen kann schwer zu verstehen, zu ändern und zu erweitern sein.
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; }
}
Beispiel für Prompt
In dieser Situation kannst du dich entscheiden, eine übergeordnete Employee
-Klasse zu verwenden, deren Eigenschaften andere Klassen erben sollen. Du kannst dabei eine andere Vererbung vermeiden, indem du alle anderen Eigenschaften für jede Klasse separat definierst.
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.
Beispielantwort
Note
Die folgende Antwort ist ein Beispiel. Da die Copilot Chat-Antworten nicht deterministisch sind, erhältst du möglicherweise eine andere Antwort als die hier beschriebene.
Copilot schlägt den folgenden Code vor:
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; }
}