我可以将子类添加到由超类组成的列表中吗?为什么这不起作用?

时间:2015-02-23 15:38:26

标签: java

我有三个不同的课程,Espacio课程(意思是"地方"),Despacho课程("办公室")和Centro课程("建筑" )。 Despacho和Centro都是Espacio的子类。

据说,一座建筑物拥有不同的地方 - 班级 - 但也有Despachos(办公室)。我无法弄清楚如何将类型办事处的某些地方添加到建筑物中的地点列表中,以便稍后能够知道它们是办公室。对不起,试着解释一下。

这是一些代码:

public EspacioImpl(TipoEspacio tipo, String nombre, Integer capacidad, Integer planta){
    checkCapacidad(capacidad);
    this.tipo = tipo;
    this.nombre = nombre;
    this.capacidad = capacidad;
    this.planta = planta;
}

public DespachoImpl(TipoEspacio tipo, String nombre, Integer capacidad, 
        Integer planta, Set<Profesor> profesores){
    super(tipo, nombre, capacidad, planta);
    tipo = TipoEspacio.OTRO;
    checkNumeroProfesores(profesores, capacidad);
    this.profesores = profesores;
    checkTipo(tipo);

}   

public CentroImpl(String nombre, String direccion, Integer numeroPlantas, Integer numeroSotanos){
    this.nombre = nombre;
    this.direccion = direccion;
    checkPlantas(numeroPlantas);
    checkSotanos(numeroSotanos);
    this.numeroPlantas = numeroPlantas;
    this.numeroSotanos = numeroSotanos;
    this.espacios = new HashSet<Espacio>();
}

这是我用来向espacios列表添加地点的功能。

@Override
public void nuevoEspacio(Espacio e) {
    Espacio aux1 = e;
    Integer plantaEspacioE = aux1.getPlanta();
    Integer sotanos = getNumeroSotanos() * -1;
    Integer plantas = getNumeroPlantas() -1;
    if(!(plantaEspacioE <= plantas && plantaEspacioE >= sotanos)) {
        throw new ExcepcionCentroOperacionNoPermitida("Planta para nuevo espacio invalida");
    }
    espacios.add(e);

}

当我测试它试图向建筑物添加地点时,它可以工作,但是当我尝试添加办公室时,它没有做任何事情。

告诉我你是否还需要其他东西。 Espacio课程:http://pastebin.com/xF3STyBM

Despacho(办公室)课程:http://pastebin.com/vAdwnjxW

Centro(建筑)课程:http://pastebin.com/ckasJBjX

2 个答案:

答案 0 :(得分:0)

您可以将子类对象添加到超类生成的列表中。实际上,您应该从超类创建实例作为子类,然后可以将它们添加到列表中。举个例子:

Superclass test = new Subclass();
listofsuper.add(test);

多数民众赞成。

答案 1 :(得分:0)

如果我正确理解您的问题,您正在寻找一种方法将办公室添加到建筑物的空间列表中;然后,你需要知道空间是一个办公室,并像办公室一样使用它。

看看这对你有帮助..

  List<Espacio> spaces = new ArrayList<Espacio>();

  Despacho office = new DespacoImpl();

  spaces.add(office);


  //Later on in the program, when you need to know that espacio = despachos....

  for(Espacio space : spaces) {
     if(space instanceof Despacho) {
         //Space is an office
         Despacho office = (Despacho) space;
     }
   }

我不知道这是否完全解决了你的问题;这里的关键是instanceof运算符,它会告诉您空间是否是办公室。

但是,如果每个不同类型的空间具有相同的操作,请考虑将其移动到Espacio的方法中。例如,如果您想知道空间是否是办公室的唯一原因是测量其大小,那么在getSize()上制作Espacio方法更有意义,而不是一系列的“如果它是一个办公室,那么这样做,如果它是一个建筑物,那就做这个”的陈述。