4

我正在练习继承。

我有两个相似的类,我想将它们同化到一个数组中,所以我想将 Object 类用作超类,因为一切都是 Object 的子类。

因此,例如,我将 T 类和 CT 类放入一个名为 all 的数组中,如下所示:

 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.

界面非常强大且易于使用。

你可以调用你的 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。如果数组中的所有对象都属于同一类,那么您的数组应该属于同一类。否则,它们都应该实现相同的接口或扩展相同的类。我无法想象你为什么要在这里显式扩展 Object,它不会添加任何功能。

于 2012-10-02T04:30:00.930 回答
1

您需要将您的object引用类型转换为适当的类来调用他们的方法..

array对于您从instanceof.

但是类型转换是一件丑陋的事情..你应该尽可能避免它..如果你必须根据确切的子类来选择调用哪个方法,你可能应该选择一个Interface..这是你可以实现什么的最好方法你想在这里...

而且我认为您已经获得了有关如何实施它的足够信息..

于 2012-10-02T04:30:36.907 回答
0

你不能这样做......因为Java不支持扩展方法。(C# 可以)

阅读以下链接:

Java 等价于 C# 扩展方法

于 2012-10-02T04:36:25.063 回答