Skip to main content

简化复杂的继承层次结构

Copilot Chat 可帮助你重构代码,以避免具有多层继承的类。

继承层次结构过深或继承使用不当,会导致代码难以维护,难以遵循类之间的关系,或在不造成破坏的情况下扩展类。

Copilot Chat 可建议将基于继承的设计重构为更灵活的基于组合的设计(组合优于继承)。 它还建议应用策略或修饰器等模式,在不增加继承结构复杂性的情况下,使系统更具可扩展性。

示例方案

下面的 C# 代码具有很深的继承层次结构,每个类都建立在前一个类的基础上。 这样就形成了一个很长的继承链,导致很难知道每个类都有哪些属性。

此类多级继承层次结构可能难以理解、修改和扩展。

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; }
}

示例提示

在这种情况下,你可能会决定使用一个父类 Employee,其他类应继承其属性,但通过为每个类单独定义所有其他属性来避免任何其他继承。

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.

示例响应

Note

以下响应是示例。 Copilot Chat 响应是不确定的,所以你可能会得到与这里所显示的不同的响应。

Copilot 建议使用以下代码:

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; }
}

其他阅读材料