[英]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.