4

外部 API の呼び出しからFoo型のオブジェクトをいくつか取得します。ローカルで、少し追加された情報でこれらのオブジェクトを処理したいので、これらの余分なフィールドを追加するサブクラスFooSonがあります。取得したすべてのオブジェクトを新しい継承された型に変換するにはどうすればよいですか? これらのオブジェクトは実際にはFooSonではないため、ダウンキャストはオプションではないようです。

私が思いついた唯一の解決策は、Fooオブジェクトを引数として取り、すべてのパブリック/保護された値を新しいFooSonオブジェクトにコピーして返す変換関数を作成することです。

欠点は次のとおりです。

  • 情報(私的価値)の喪失
  • Fooが変更された場合は、convert 関数を適応させる必要があります。

クラス Foo は、コピー コンストラクターまたはクローン オペレーターを実装しません。私は Foo のソース コードを持っていますが、将来のリリースとの互換性を維持するために変更を避けたいと考えています。それにもかかわらず、それが唯一の実行可能な代替手段である場合は、必要なものを取得するために Foo の実装を変更します。

4

5 に答える 5

4

ここでデコレータパターンが機能するはずだと思います:

class Foo implements FooApi {...}

class FooSon implements FooApi {
    private FooApi decoratedFoo;
    private String additional;

    public FooSon(FooApi decoratedFoo) {
        this.decoratedFoo = decoratedFoo;
    }
    ...
}

ただし、これを行うことができるのは、Foo オブジェクトのインターフェイスがある場合のみです。

于 2011-03-27T13:15:18.263 に答える
4

FooSon には、Foo であるフィールドを含めることができます。次に、返された値をそのフィールドに割り当てます。次に、Fooson でメソッドを作成して、外部から Foo から必要な情報を得るために Foo フィールドへの呼び出しを委譲することができます。

于 2011-03-27T12:54:19.833 に答える
0

問題を完全に理解していないのかもしれませんが、Foo をサブクラス化 (継承) する代わりに、FooSon (構成) にフィールド型のように Foo を格納しないのはなぜですか?

いずれにせよ、オブジェクトが外部ライブラリに定義されているためにアクセス制御を Foo 型に変更できない場合は、プライベート フィールドに直接アクセスすることはできません (これはまさにプライベート フィールドのプロパティです)。これらのプライベート フィールドに getter および setter メソッドからアクセスできる場合は、そのメソッドを FooSon クラスにラップします。

于 2011-03-27T12:55:13.910 に答える
0

さて、あなたがすでに知っているように、この状況ではダウン キャスティングは適用されません。次のオプションが表示されます。

  • 外部ライブラリは、FooSon代わりにインスタンス化するために使用できるいくつかのファクトリ メカニズムを提供しますFoo

  • 受信者は、デリゲーター パターンを使用して、Fooオブジェクトをオブジェクトにラップします。FooSon

  • Foo受信者は、キーとしてマップを使用して、追加情報をオブジェクトに論理的に添付Fooします。

于 2011-03-27T12:55:50.447 に答える
0

ダウンキャストしないでください。成功する保証はありません。この問題を処理するより良い方法があります。1 つには、別のクラスで Foo オブジェクトをラップし、適切なメソッド呼び出しを Foo オブジェクトにデリゲートすることができます。

基本的な OO の概念を理解するために少し時間をかけることをお勧めします。特に、「構成と継承」のグーグル、このリンクはまともな説明のようです。

于 2011-03-27T13:00:41.120 に答える