簡體   English   中英

我可以將子類添加到由超類組成的列表中嗎? 為什么這不起作用?

[英]Can I add a subclass to a list made of the superclass? Why isn't this working?

我有三個不同的班級,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

您可以將子類對象添加到超類創建的列表中。 實際上,您應該從超類創建您的實例作為子類,然后您可以將它們添加到列表中。 舉個例子:

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

就是這樣。

如果我正確理解了您的問題,那么您正在尋找一種將辦公室添加到建築物空間列表的方法; 之后,您需要能夠知道該空間是一個辦公室,並像辦公室一樣使用它。

看看這對你有沒有幫助..

  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的方法中。 例如,如果你想知道一個空間是否是辦公室的唯一原因是測量它的大小,那么在Espacio上創建一個getSize()方法更有意義,而不是一系列“如果它是一個辦公室,然后執行此操作,如果是建築物,則執行此操作”聲明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM