0

サブクラス SC1、SC2、... を持つ基本クラス BC と、オブジェクトのコレクション C (一部はタイプ SC1、一部はタイプ SC2、...) があるとします。メソッド m は、BC ではなく、サブクラスで定義されています。私はこのようなことをしたいと思っています:

class AnotherClass {
  private BC getObj(Container c) { /*return something from c*/ }

  private void anotherMethod() {
    ...
    BC o = getObj(c);
    o.m();
  }
}

これで、getObj はオブジェクトへの参照 o を返します。私が知る限り、それは BC 型でなければなりません (または、ここでジェネリックを適用する方法はありますか?)。そのままコンパイル エラーが発生します (m() は BC に存在しません)。これを行うための良い方法があると思います(何らかの方法で o の実際のタイプを「手動で」把握する必要はありません)?

4

3 に答える 3

2

メソッドが で定義されていないのはなぜBCですか? これがポリモーフィズムのすべてです。

もう 1 つのオプションは、オブジェクトに を含むインターフェイスを実装させ、m代わりにそのインターフェイスのコレクションを持たせることですBC。または、リフレクションを使用するか (ew)、タイプを確認します (ew)。

于 2013-07-17T23:08:43.743 に答える
0

この時点で

BC o = getObj(c);

オブジェクトへの参照 o があります。コンパイル時に、コードが事実として知っている唯一のことは、この参照が指すもの (BC、または BC のサブクラス) が BC で定義されたメソッドを持っているということです。指定したサブクラスが SC1 または SC2 のインスタンスであることを認識できません。したがって、問題は、サブクラスでのみ定義されたメソッドを実行する必要があることです。ここにはいくつかのオプションがあります。

  1. リフレクション - Java のリフレクション機能を使用して、指定されたオブジェクトを検査し、メソッドが使用可能かどうかを確認してから呼び出します。ただし、コンパイル時のチェックが失われ、これは遅くなります。好ましい解決策ではない
  2. c のインスタンスを確認し、適切な型にキャストしてから、メソッドを呼び出します。これは機能しますが、instanceof も遅く、サブクラス化とポリモーフィズムの目的を無効にします。また、お勧めしません。
  3. メソッド (BC をインスタンス化する必要がない場合はおそらく抽象) を BC に導入し、サブクラスでオーバーライドします。このメソッドを直接呼び出します。これはより良い解決策であり、おそらくあなたが目指すべきものです。
  4. 上記と同様ですが、サブクラスが実装するインターフェイスを使用し、メソッドがそのインターフェイスを返すようにします。
于 2013-07-18T00:03:12.650 に答える