Tiefe Vererbungshierarchien oder die unsachgemäße Verwendung von Vererbung können zu schwer wartbarem Code führen, da es schwierig ist, die Beziehungen zwischen den Klassen zu verfolgen oder sie zu erweitern, ohne dass es zu Fehlern kommt.
Copilot-Chat kann ein Refactoring von vererbungsbedingten Designs zu flexibleren kompositionsbedingten Designs vorschlagen (wobei Komposition gegenüber Vererbung bevorzugt wird). Es kann auch empfehlen, Muster wie Strategy oder Decorator anzuwenden, um das System erweiterbar zu machen, ohne die Vererbungsstruktur komplexer zu machen.
Beispielszenario
Der folgende C# Code hat eine tiefe Vererbungshierarchie, in der jede Klasse auf der vorherigen aufbaut. Das Ergebnis ist eine lange Vererbungskette, die es schwierig macht, zu wissen, welche Eigenschaften die einzelnen Klassen haben.
Eine mehrstufige Vererbungshierarchie wie diese 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 könntest du dich entscheiden, eine übergeordnete Employee Klasse zu verwenden, deren Eigenschaften andere Klassen erben sollen, aber jede andere Vererbung zu 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.
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; }
}
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.
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
Hinweis
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; }
}