0

サブクラス B1 と B2 によって拡張されたスーパークラス A があります。次に、B1 または B2 のいずれかを拡張する 5 つのサブクラス (C1、C2、C3、C4、C5) があります。

これら 5 つのサブクラスのそれぞれを含む配列を作成しようとしています。

これらのオブジェクトはすべて、タイプ A のインスタンスとしてインスタンス化されます。

ClassA[] objects = new ClassA[5];

各オブジェクトをサブクラスの 1 つに再割り当てしようとします。

objects[0] = new ClassC1;
objects[1] = new ClassC2;  // etc...

この時点で、クラス A に存在するメソッドは正常に機能しますが、B1/B2 または他のサブクラスで定義されたメソッドは見つかりません。

objects[0].MethodFromC1();   // returns a "symbol not found" error 

instanceof キーワードは、objects[0] がクラス A、B1/B2、および C1 のインスタンスであることを示します。

サブクラスのメソッドをコードに認識させながら、(ループして操作を実行するために) クラス オブジェクトの配列を維持するにはどうすればよいでしょうか?

4

4 に答える 4

3

instanceofクラスに基づいて多くの条件付きロジックを実行している場合、オブジェクト指向言語の利点を完全に逃しています。Cに固執するだけです。

do()たとえば、 で抽象化されているClassAが で実装されClassBているメソッドが必要ClassCです。次に、配列を反復処理し、do()そこにあるすべてのオブジェクトを呼び出します。ポリモーフィック呼び出しにより、 rightdo()が呼び出されます。

それが役立つことを願っています。

于 2013-10-09T01:49:01.430 に答える
1

Java でバリアントを実装しようとしています。このテーマは、私がこの言語について最も嫌いなことの 1 つです。

http://jazzjuice.blogspot.com/2010/10/6-things-i-hate-about-java-or-scala-is.html

そこにバリアントを実行するための次善の方法を 8 つ挙げました。

于 2013-10-09T01:46:00.560 に答える
1

if ステートメントで instanceof キーワードを使用して、オブジェクトを目的の型にキャストできます。例えば、

for (ClassA obj : objects) {
    // do something common...

    if (obj instanceof ClassC1) {
        ClassC1 c1Obj = (ClassC1) obj;
        c1Obj.MethodFromC1();
    }
}
于 2013-10-09T01:41:20.233 に答える
1

のメンバーであることが保証されているだけなので、配列内の要素はobjects何も知りません。ClassC1ClassA

たとえば、AnimalサブクラスCatとそのサブクラスのクラス階層がある場合Lion、メソッドを呼び出そうとしていますAnimal.maimSafarigoer()Animal一般に、safarigoers については何も知らず、Lionその方法を知っているのは s だけです。

演算子を使用instanceofして、特定のサブタイプを操作しているかどうかを確認します。

(恐ろしい比喩でごめんなさい。:-))

于 2013-10-09T01:41:26.900 に答える