1

私には既存のクラスの階層があり、次のように言います。

Business
  - Division
    - ProjectTeam
      - Employee

これらのクラスは、逆シリアル化によってインスタンス化されます。

ただし、ライブラリの特定のユーザーのEmployeeに追加のフィールドを公開する必要があります。つまり、次のように言います。

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

問題は、「Business」を拡張するクラスを作成することはできないということです。これは、「Employee」クラスに追加したいためです。

私が見ているように、私には2つの選択肢があります。

  1. 'Special'クラスで階層を複製します。つまり、各「特別」クラスには、元のクラスのコレクションと新しい「特別」クラスのコレクションがあります。

    SpecialBusiness
      - Division AND SpecialDivision (extends Division)
        - ProjectTeam AND SpecialProjectTeam (extends ProjectTeam)
          - Employee AND SpecialEmployee (extends Employee)
            - Degree
    
  2. どういうわけか、逆シリアル化の目的で、実行時に「Employee」を「SpecialEmployee」に再入力します。すべての「Employee」オブジェクトをSpecialBusinessから「SpecialEmployee」にコードベースでキャストできることを知ってください(おそらくヘルパーメソッドを使用してそれを明確にします)。

この問題に対処する方法について何かアイデアはありますか?

4

7 に答える 7

1

XmlSerializer や BinaryFormatter などのほとんどのシリアル化フレームワークは、独自の方法でストリームを逆シリアル化する方法を提供するため、更新された/新しい階層を持ち、古いストリームを逆シリアル化できます。どのようなシリアル化フレームワークを使用していますか?

于 2009-11-09T18:08:37.760 に答える
1

実行時に必要なクラスをインスタンス化するために、逆シリアル化のためにソースをいじることができないのはなぜですか?

于 2009-11-09T18:09:14.767 に答える
1

今できるかどうかはわかりませんが、オブジェクト構造全体で具体的なクラスではなくインターフェースを使用する必要があります。

于 2009-11-09T18:04:56.053 に答える
1

実行時にフィールドのタイプを変更することはできません。

そうは言っても、それがやりたいのであれば、従業員を拡張できないのはなぜですか? ポリモーフィズムは、サブタイプのオブジェクトをそのスーパータイプのフィールドにプラグインできると述べていますか? 親オブジェクトを書き換える必要があるのはなぜですか?

于 2009-11-09T17:38:56.083 に答える
1

まあ、それがあなたの状況に適しているかどうかは完全にはわかりませんが、この質問に対する私の答えを見てください。Decorable から Division および Employee クラスを派生させ、 and から SpecialDivision および SpecialEmployee クラスを派生させることができDecorator<Division>ますDecorator<Employee>

于 2009-11-09T17:42:40.653 に答える
0

考えられる解決策の 1 つ (選択した逆シリアル化方法でプライベート フィールドのシリアル化が許可されていると仮定します):

質問の方法 1 (つまり、別の階層) を使用して、クラスの拡張バージョンをプライベート フィールドに格納します。逆シリアル化の後、通常のパブリック非拡張フィールドを拡張バージョンで更新し、これらのフィールドのキャスト バージョンを返すメソッドを含めます。

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