gpt4 book ai didi

java - 调用抽象类列表中的类的函数

转载 作者:行者123 更新时间:2023-12-01 13:56:39 24 4
gpt4 key购买 nike

我在理解 OOP、抽象类和列表方面遇到了一些困难。我当前的项目是在处理中 - 当然只是为了原型(prototype)设计。

我的问题是我有一个包含一些相同变量的对象列表。因此,我为它们创建了一个抽象类,然后创建了所有对象的列表(抽象类作为列表),然后将变体对象添加到“抽象”列表中。

这是代码 - 整个交易可以在下面找到:

ArrayList<Vehicle> vehicles = new ArrayList<Vehicle>();

void setup() {
vehicles.add(new Motorcycle());
vehicles.add(new Motorcycle(2,"Yamaha"));
vehicles.add(new Truck());
vehicles.add(new Truck(4,"ASU AC2",2));

print(vehicles);
vehicles.get(3).dropLastTrailer();
}

卡车:

class Truck extends Vehicle {
int numOfTrailers;

Truck() {
super();
numOfTrailers = 0;
}

Truck(int size, String name, int numOfTrailers) {
super(size, name);
this.numOfTrailers = numOfTrailers;
type = "Truck";
}

void dropLastTrailer() {
numOfTrailers--;
println("Dropped one trailer, the truck now got " + numOfTrailers + " trailers");
}
}

车辆:

abstract class Vehicle {
int speed, size;
String name;
String type;

Vehicle() {
this((int)random(0,6),"Unknown Vehicle");
type = "Vehicle";
}

Vehicle(int size, String name) {
this.size = size;
this.name = name;
}

String toString() {
return (name + " is " + size + "m long " + type);
}
}

代码一直有效,直到我尝试调用“dropLastTrailer”函数,该函数显示该方法不存在。我想这是正确的,因为它认为它只是一个车辆对象,而不是卡车。

我该如何解决这个问题?

完整代码可以在这里找到: https://github.com/Jalict/processing-experiments/tree/master/oop_abstract_list

最佳答案

您希望编译器如何知道它一辆卡车?您已经申报了车辆 list 。想象一下,如果您使用 list.get(0) 而不是 list.get(3) - 那么该值将是对 Motorcycle 的引用>,不是卡车

您可以通过强制转换来解决此问题:

((Truck) vehicles.get(3)).dropLastTrailer();

...但此时您的代码假设列表中对象的类型,这并不理想。您可以将其设为条件:

Vehicle mightBeTruck = vehicles.get(3);
if (mightBeTruck instanceof Truck) {
Vehicle truck = (Truck) mightBeTruck;
truck.dropLastTrailer();
}

这更安全,但从设计角度来看仍然不是很好。不幸的是,给出的示例没有足够的上下文来将其应用到现实世界的任务 - 有时这样的事情确实是必要的。通常有更简洁的方法,但这取决于您想要实现的目标。

关于java - 调用抽象类列表中的类的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19587945/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com