代码之家  ›  专栏  ›  技术社区  ›  Matt Mitchell

在运行时更改C中字段的类型

  •  1
  • Matt Mitchell  · 技术社区  · 15 年前

    我有一个现存的阶级分类,比如说:

    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”以进行反序列化。要知道,我可以在代码库中将所有“Employee”对象从一个SpecialBusiness转换为“SpecialEmployee”(可能使用helper方法使其变得明显)。

    关于如何处理这个问题有什么想法吗?

    7 回复  |  直到 15 年前
        1
  •  1
  •   C. Ross trotttrotttrott    15 年前

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

    也就是说,如果你想这样做的话,为什么不能直接延长员工的工作时间呢? Polymorphism

        2
  •  1
  •   Community CDub    7 年前

    嗯,我不完全确定它是否适合你的情况,但看看我的答案 this question . 您可以从Decorable派生您的部门和员工类,并从Decorable派生SpecialDivision和SpecialEmployee Decorator<Division> Decorator<Employee> .

        3
  •  1
  •   Jon Seigel    15 年前

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

        4
  •  1
  •   Anton Tykhyy    15 年前

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

        5
  •  1
  •   Trent    15 年前

    为什么不能使用源代码进行反序列化,以便在运行时实例化所需的类?

        6
  •  1
  •   guest    15 年前

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

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

    至少当从声明的类型(这里是Employee[]Employees)延迟时,XMLSerializer在反序列化时很好地支持多态性,因为它将创建一个Name=“Carol”和Degree=“Chief”的SpecialEmployee;给定的SpecialEmployee是从Employee派生的,XMLSerializer会被告知这一点。
    这可以通过xmlclude属性完成,也可以通过在创建XMLSerializer时提供专门的类型来完成。

        7
  •  0
  •   Matt Mitchell    15 年前

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

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

    SpecialProjectTeam
      - (private) SpecialEmployees
      - (public) Employees
      - (public) GetSpecialEmployees (returns Employees field cast as SpecialEmployees)