1

我有一个现有的类层次结构,这样说:

Business
  - Division
    - ProjectTeam
      - Employee

这些类是通过反序列化实例化的。

但是,现在我需要在 Employee 中为库的特定用户公开额外的字段,即这样说:

SpecialBusiness (extends Business)
  - Division
    - ProjectTeam
      - SpecialEmployee (extends Employee)
        - Degree

问题是,我不能只创建一个扩展“业务”的类,因为我想要添加的是“员工”类。

正如我所看到的,我有两个选择:

  1. 使用“特殊”类复制层次结构。这意味着每个“特殊”类都将有一个原始类的集合和一个新的“特殊”类的集合。

    SpecialBusiness
      - Division AND SpecialDivision (extends Division)
        - ProjectTeam AND SpecialProjectTeam (extends ProjectTeam)
          - Employee AND SpecialEmployee (extends Employee)
            - Degree
    
  2. 出于反序列化目的,在运行时以某种方式将 'Employee' 重新键入为 'SpecialEmployee'。知道我可以将 SpecialBusiness 中的所有“Employee”对象转换为代码库中的“SpecialEmployee”(可能使用辅助方法使其显而易见)。

关于如何处理这个问题的任何想法?

4

7 回答 7

1

您不能在运行时更改字段的类型。

就是说,如果您想这样做,为什么不能只扩展员工呢? 多态性表明您可以将子类型的对象插入其超类型的字段中?为什么需要重写父对象?

于 2009-11-09T17:38:56.083 回答
1

好吧,我不完全确定它是否适合您的情况,但请查看我对这个问题的回答。Decorator<Division>您可以从 Decorable 派生 Division 和 Employee 类,并从和派生 SpecialDivision 和 SpecialEmployee Decorator<Employee>

于 2009-11-09T17:42:40.653 回答
1

当 XML 将实际对象类型声明为:

  <Employees>
    <Employee>
      <Name>Bob</Name>
    </Employee>
    <Employee xsi:type="SpecialEmployee">
      <Name>Carol</Name>
      <Degree>Chief</Degree>
    </Employee>
  </Employees>

至少在延迟声明类型(此处为 Employee[] 雇员)时,XMLSerializer 很好地支持反序列化时的多态性,因为它将创建一个 Name="Carol" 和 Degree="Chief" 的 SpecialEmployee;给定的 SpecialEmployee 派生自 Employee 并且 XMLSerializer 被告知。
这可以通过 XmlInclude 属性或通过在创建 XMLSerializer 时提供专门的类型来完成。

于 2009-11-15T13:20:09.057 回答
1

我不知道你现在是否可以这样做,但是整个对象结构应该使用接口而不是具体的类。

于 2009-11-09T18:04:56.053 回答
1

大多数序列化框架,例如 XmlSerializer 和 BinaryFormatter,提供了以自定义方式反序列化流的方法,因此您可以拥有更新/新的层次结构并将旧流反序列化到其中。你使用什么样的序列化框架?

于 2009-11-09T18:08:37.760 回答
1

为什么你不能用你的反序列化源来在运行时实例化你想要的类?

于 2009-11-09T18:09:14.767 回答
0

一种可能的解决方案(假设选择的反序列化方法允许私有字段序列化):

使用问题中的方法 1(即单独的层次结构)并将类的扩展版本存储在私有字段中。反序列化后,使用扩展版本更新常规公共非扩展字段,并包含一个返回这些字段的转换版本的方法。

SpecialProjectTeam
  - (private) SpecialEmployees
  - (public) Employees
  - (public) GetSpecialEmployees (returns Employees field cast as SpecialEmployees)
于 2009-11-09T18:15:43.997 回答