4

私は相続を実践しています。

1つの配列に同化したい2つの類似したクラスがあるので、すべてがObjectのサブクラスであるため、Objectクラスをスーパークラスとして使用することを考えました。

したがって、たとえば、TクラスとCTクラスを次のように呼び出される配列に入れます。

 Object all[] = new Object[6];

    all[0] = T1;

    all[1] = CT2;

    all[2] =T3;

    all[3] = CT1;

    all[4] = T2;

    all[5] = CT3;

それは私の問題ではないので、私は宣言をスキップしました。

私の本当の問題は、ループを利用して配列内の関数を呼び出したいときに発生します。

for (int i = 0; i < 6; i++) {

    all[i].beingShot(randomNum, randomNum, AK47.getAccuracy());
}

TとCTにそれぞれ関係するクラスには、パブリックであるbeingShotメソッドがあります。

Eclipseは、簡単な修正としてそれらをキャストすることをお勧めします。長期的には、beingShotメソッドを保持する独自のObjectクラスを作成するか、これをObjectのクラスに追加する以外に、論理的な代替手段があるかどうか疑問に思っています。

ありがとう!

4

4 に答える 4

13

両方のクラスが同じメソッドを実装している場合は、の作成を検討する必要がありますinterface

インターフェイスは非常に強力で使いやすいです。

インターフェイスを呼び出すことができますShootable

Shootableを実装するさまざまなオブジェクトの配列を作成し、それらをすべて同じように扱うことができます。

// Define a VERY simple interface with one method.

interface Shootable {
    public void beingShot();
}

// Any class that implements this interface can be treated interchangeably

class Revolver implements Shootable {
    public void beingShot() {
        System.out.println("Revolver: firing 1 round");
}

class MachineGun implements Shootable {
    public void beingShot() {
        System.out.println("Machine Gun: firing 50 rounds");
    }
}

class HockeyPuck implements Shootable {
    public void beingShot() {
        System.out.println("Hockey Puck: 80 MPH slapshot");
    }
}

class RayBourquePuck implements Shootable {
    public void beingShot() {
        System.out.println("Hockey Puck: 110 MPH slapshot");
    }
}

class OunceOfWhiskey implements Shootable {
    public void beingShot() {
        System.out.println("Whiskey Shot: 1 oz down the hatch...");
    }
}

// You can declare an array of objects that implement Shootable

Shootable[] shooters = new Shootable[4];

// You can store any Shootable object in your array:

shooters[0] = new MachineGun();
shooters[1] = new Revolver();
shooters[2] = new HockeyPuck();
shooters[3] = new OunceOfWhiskey();

// A Shootable object can reference any item from the array

Shootable anyShootableItem;

// The same object can to refer to a MachineGun OR a HockeyPuck

anyShootableItem = shooters[0];
anyShootableItem.beingShot();

anyShootableItem = shooters[2];
anyShootableItem.beingShot();

// You can call beingShot on any item from the array without casting

shooters[0].beingShot();
shooters[1].beingShot();

// Let's shoot each object for fun:

for (Shootable s : shooters) {
    s.beingShot();
}

これは、関連するすばらしい質問と回答です。

于 2012-10-02T04:31:29.510 に答える
1

オブジェクトにはbeingShotメソッドがありません。配列内のすべてのオブジェクトが同じクラスである場合、配列は同じクラスである必要があります。それ以外の場合は、すべて同じインターフェイスを実装するか、同じクラスを拡張する必要があります。ここでオブジェクトを明示的に拡張したい理由は想像できません。機能はまったく追加されていません。

于 2012-10-02T04:30:00.930 に答える
1

objectメソッドを呼び出すには、適切なクラスへの参照を型キャストする必要があります。

からフェッチする参照ごとに、オブジェクト参照によって参照されるインスタンスである演算子arrayを使用してチェックする必要があります。したがって、そのクラスへの参照を型キャストできます。instanceof

しかし、型キャストは醜いものです..可能な限り避ける必要があります..正確なサブクラスに基づいて呼び出すメソッドを選択する必要がある場合は、おそらくInterface..を使用する必要があります。これは、何を達成できるかを達成するための最良の方法です。ここが欲しい...

そして、あなたはそれを実装する方法について十分な情報を持っていると思います。

于 2012-10-02T04:30:36.907 に答える
0

Javaは拡張メソッドをサポートしていないため、できません。(C#はそうです)

以下のリンクをお読みください:

C# 拡張メソッドに相当する Java

于 2012-10-02T04:36:25.063 に答える