代码之家  ›  专栏  ›  技术社区  ›  Federico klez Culloca

课堂设计“困境”

  •  2
  • Federico klez Culloca  · 技术社区  · 14 年前

    我从来没有做过正确的课堂设计,所以请放心。

    假设我们有一个 Project 班级。那么假设我们有一个 ProjectGroup 类的成员与 项目 类,加上 项目 S.

    应该 项目组 成为 项目 或是 项目组 专业化 项目 前者应该是后者的一个子类吗?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Robert Koritnik    14 年前

    我不会用理论来烦你的 因为你可能很快就要得到一个快速的答案。接下来是:

    如果您的两个类实际上意味着它们应该通过继承来关联,那么 ProjectGroup 应继承自 Project 班级。这就是它在C中的样子:

    public class ProjectGroup: Project ...
    

    如果不是,但它们使用一些公共类成员(定义它们的状态和该状态上的一些功能),那么我将编写一个接口并在两个类中实现它。C代码再次:

    public interface ICommonState ...
    
    public class Project: ICommonState ...
    
    public class ProjectGroup: ICommonState
    {
        IEnumerable<ICommonState> projects
        ...
    }
    

    编辑

    如果你的课程 项目 项目组 它们都有这样的特性 ID Name 在共同点上(例如),它们仍然不应该被继承。它们恰好具有相同名称的属性,但它们基本上是不同的实体。

    他们两个都可以

    • 实现一个 ICommonEntity 界面-当它们具有相同的状态+功能,但功能在每种状态下的行为不同时使用它
    • 继承自 CommonEntity 类-当功能完全相同时使用它;这样您就可以按照 干的 (不要重复)哲学

    因此,您的组件可能是接口或类(使用复合模式时)。

    在实体相互关联的情况下,两个类之间的直接继承更为合适。喜欢 User Person 类。它们可以通过任何一种方式被继承。取决于业务场景。

    class User: Person  
    

    在这种情况下,您将有一个联系人应用程序。他们中的一些人也是这个非常相同的应用程序的用户。

    class Person: User  
    

    这将是一个您可以注册为用户的网站。如果你填写了一些个人信息,你的用户数据就会变成 .

        2
  •  2
  •   Patrick    14 年前

    听起来您可能需要复合模式。leafproject和compositeproject都实现了项目接口,compositeproject还拥有一组项目实例。

        3
  •  0
  •   Athens Holloway    14 年前

    如果项目的成员列表对于ProjectGroup是唯一的,并且不适用于所有类型的项目,那么将Project设为超级/基类,并从Project派生ProjectGroup。