父和子的ArrayList。不抽象

时间:2014-03-03 21:57:39

标签: java inheritance

如果我有班级驾驶员和班级经理。

Manager继承自Driver

public class Driver { ...

public class Manager extends Driver { ...

我正在尝试编写一个简单的登录信息,以便管理员有一个不同的菜单来执行更多操作。但我无法弄清楚如何将这两种类型存储在我的Depot类的ArrayList中。

public class Depot {

public ArrayList<Driver> arrayDrivers = new ArrayList<Driver>();

因为显然现在添加到此阵列的任何内容现在都是驱动程序,而不适用于管理器。

当我尝试时:

public ArrayList<? extends Driver> arrayDrivers = new ArrayList<Driver>();

我收到错误:

public Depot( ArrayList<Driver> tempDriver)     {
    arrayDrivers.addAll(tempDriver);
}

即使我改为

ArrayList<? extends Driver> tempDriver

任何人都可以帮助我,我无法弄清楚这一点。

我理解最好创建一个抽象类的用户,例如然后创建驱动程序和管理器,但这是用于课程作业,我必须遵循图表和说明。

编辑:

我读到的地方并非如此,我必须被误导。

所以,即使我获得这样的指针,它仍然应该作为管理器执行?

public boolean authenticateDriver(String username, String password, Driver driver) {

    Driver userDriver = GetDriver(username); //Not a manager anymore?

    if(userDriver != null) {
        driver = userDriver;
        return userDriver.checkPassword(password);
    }
    else {
        return false;
    }

}

public Driver GetDriver(String driver) {
    for (Driver currentDriver : arrayDrivers) {
        if (currentDriver.userName.equals(driver)) {
            return currentDriver;
        }
    }
    return null;
}

4 个答案:

答案 0 :(得分:1)

我相信:

public ArrayList<Driver> arrayDrivers = new ArrayList<Driver>();

会奏效。向此ArrayList添加管理器时,它们不会成为驱动程序。当你调用.showMenu()或其他什么时,多态将保证调用管理器的showMenu()版本。

答案 1 :(得分:1)

Manager扩展Driver,因此如果您构建ArrayList<Driver>,您也可以在其中存储Manager个对象,而表现得像Manager,如果适用的话。

这称为polymorphism,它允许您为各种类型的对象定义不同的行为,然后使用它,而不知道您将在运行时接收哪种对象。

因此,您可以为.showMenu()Driver定义不同的Manager方法,并在获得user类的对象Driver时调用{{ 1}},将运行适当的方法版本,具体取决于user.showMenu()user还是Manager类。

编辑:

至于你问题的第二部分,基本上是,如果你在DriverDriver类中定义了相同的方法,那么它的适当版本将是调用,取决于您的对象的类。 如果但是只在Manager类中定义了它,则DriverDriver对象将使用相同版本的方法。

如果您的方法仅在Manager中定义,而在Manager中未定义,则无法为Driver类型变量调用此方法,无论其类型如何对象将在运行时保存,因为您永远无法确定该变量将始终包含Driver对象。

答案 2 :(得分:0)

创建超类对象的数组列表。每当你想声明子类对象时,声明如下:

Driver driver = new Manager(...);

同样,当您想使用Manager方法调用Driver时,请使用强制转换。

BTW,拥有名称Manager包含子类的名称(类Employee和类ManagerEmployee扩展Employee)可能使代码更容易阅读。我同意你的意见 - 不是这种类命名系统的粉丝。

答案 3 :(得分:0)

泛型并不完美。有时您必须降级事物以完成编译并知道您的代码维护合同。如果你转换数组,你将传递给原始列表的addAll()调用它将起作用。

public Depot( ArrayList<Driver> tempDriver)     {
    arrayDrivers.addAll((List)tempDriver);
}