繁体   English   中英

链继承Java

[英]Chain inheritance java

我正在尝试实施救助车协会

但我首先关注车辆部分,车辆可以是HeadQuarter或Machine

然后将机器指定为支援车辆(SV)或紧急车辆(EV)

EV和SV都扩展了扩展车辆的机器

机器之所以特别是因为它们可以运送人,所以我在机器类中定义了一种方法Embark(String),该方法将字符串存储在arraylist中,这是机器类的属性。

然后我进入协会的实现,一个协会有一个车辆的ArrayList(可以是Machine(指定为EV或SV)或HQ的机器),但是当我尝试将人放在SV中时,我不能访问机器方法

我不太明白为什么有人可以向我解释? 非常感谢你

这是Society.java

import Vehicle.*;
import Vehicle.machine.SupportVehicle;
import Vehicle.machine.EmergencyVehicle;
import Vehicle.machine.*;

public class Society {
private ArrayList <Vehicle> Vehicles;
public void AddVehicle(Vehicle V1){
    this.Vehicles.add(V1);
}

public Society(){
    this.Vehicles = new ArrayList<Vehicle>();
}

public static void main(String[] args){

    Society S;
    S = new Society();

    SupportVehicle SV;

    SV =  new SupportVehicle();

    Vehicle V1; 
    V1 = new Vehicle();
    S.AddVehicle(V1);
    S.Vehicles.get(0).embark("bar"); // Embark is a Machine Method but i can't access it  : " The method Embark(string) is undefined for the type Vehicle

}

}

问题是“所以我在机器类中定义了Embark(String)方法”,而您想从车辆访问该方法。

机器扩展了车辆,因此车辆无法使用机器的方法。

一种可能的解决方案是将该方法添加到Vehicle类。

另一种解决方案是使用专用的ArrayList机器而不是专用的ArrayList Vehicles。

如果要使用((Machine)S.Vehicles.get(0))。embark(“ bar”); 您应该先检查instance =“ if S.Vehicles.get(0)instanceof Machine”

PS:变量应以小写=开头

你的问题是,你“看”通过你的对象Vehicle -Class“眼镜”,因为你想打电话的方法S.Vehicles.get(0)Vehicles的类型的列表Vehicle 在这种情况下,您只能看到Vehicle -Class的功能。 要查看Machine -Class的方法,您需要先将对象强制转换为Machine -Class:

((Machine)S.Vehicles.get(0)).embark("bar");

embark( String str)是在Machine类而不是Vehicle类中定义的方法。 编译器不知道Society.Vehicles包含Machine Class的实例,因为它可能包含Vehicle Class本身或其他扩展的实例。

1)如果您知道协会中的所有Vehicle实例都将是Machine Instance,而不仅仅是更改车辆的类型,如下所示

private ArrayList <Machine> Vehicles;

2)如果上述情况不成立,那么以下将有所帮助

if(S.Vehicles.get(0) instanceof Machine)
{
    ((Machine)S.Vehicles.get(0)).embark("Something");
}

大家好,谢谢大家的回答,我都读了,发现问题是编译问题,我在vechile中添加了embark方法(字符串n1),并在机器中覆盖了它,以便在执行代码时一切顺利

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM