如果我有班级驾驶员和班级经理。
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;
}
答案 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
类。
编辑:
至于你问题的第二部分,基本上是是,如果你在Driver
和Driver
类中定义了相同的方法,那么它的适当版本将是调用,取决于您的对象的类。 如果但是只在Manager
类中定义了它,则Driver
和Driver
对象将使用相同版本的方法。
如果您的方法仅在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);
}