代码之家  ›  专栏  ›  技术社区  ›  Jack Ryan

将对象从基类转换为子类是否有效

  •  13
  • Jack Ryan  · 技术社区  · 17 年前

    Contact ,代表任何人。在最基本的层面上,这用于表示业务联系人。然而,它也可以用来代表公司的员工。还有几种特殊类型的员工(假设有一种叫做 Manager

    当员工晋升为经理时,困难就来了。转换基类可以吗 Employee 到继承类 经理 .

    顺便问一下,NHibernate支持这种行为吗?这就像得到员工、从员工中创建经理、然后拯救经理一样简单吗?

    6 回复  |  直到 17 年前
        1
  •  16
  •   Terry Wilcox    17 年前

    在这种情况下,我会选择组合而不是继承。如果你坚持继承,每次升职或降职,每次雇佣联系人或员工离职并成为正式联系人时,你都会换班。

        2
  •  5
  •   Joseph    17 年前

    然而,在我看来,你应该有这样的东西:

    Manager Promote(Employee employee)
    {
       var manager = new Manager();
       //promote your employee to a manager here
       return manager;
    }
    

    在某种工作流过程中。

    关于NHibernate,听起来你是在将ORM逻辑与业务域混合在一起。将员工晋升为经理是一个业务领域结构,因此属于您的业务模型。然而,NHibernate如何将你的员工和经理映射到你的数据库中,除了如何映射他们之外,与你的商业模式无关。不过,这绝对与如何将员工晋升为经理无关。

        3
  •  2
  •   Boris Callens    17 年前



    优点有两个:

    • 很容易给一个人或从一个人那里得到一个角色

        4
  •  2
  •   Jamie Ide    17 年前

    • public static Manager Promote(Employee employee) { ... }
    • Manager上的专业构造师

        5
  •  0
  •   Rob Wells    17 年前

    你好,

    我的直觉是,你错误地表示了一个Manager对象。

    回到基础,从面向对象的角度思考,你的基类(Contact)包含Employee和Manager对象的公共元素。任何派生对象都只是基类的特殊化。

    目前我能看到的唯一区别是,Manager对象现在有一组Employee对象,这些对象是它们自己的directReports。这可能应该实现为指向Employee对象容器的指针。

    我想不出任何需要将Employee对象与Manager对象分离的行为专业化。

    嗯,也许可以创建包含联系人详细信息的基类Person。

    编辑: 对不起,从你的评论来看,我想我不够清楚。我所描述的不会导致两个单独的类都直接从您的Contact类派生出来,因此您必须在运行时将Employee的实例更改为Manager,这是您最初的问题。

    有两个派生类,一个Manager和一个Employee,在我看来是完全错误的。你试过用“isa”和“has a”的关系来分解事情吗。然后你可以看到你的基本结构是错误的。

    希望这能帮到你

        6
  •  0
  •   Mark Schultheiss    17 年前

    员工在角色中(M-M关系)许多员工扮演许多角色