import java.util.Date; public abstract class EntidadBiologica implements Cloneable { private String nombre; private double peso; private double altura; private Date fechaNacimientoOriginal; private Date fechaNacimiento; private String estado; public EntidadBiologica(String nombre, double peso, double altura, Date fechaNacimientoOriginal) { this.nombre = nombre; this.peso = peso; this.altura = altura; this.fechaNacimientoOriginal = new Date(fechaNacimientoOriginal.getTime()); this.fechaNacimiento = new Date(fechaNacimientoOriginal.getTime()); // por omisión, igual a original this.estado = "neutro"; } // Métodos getters y setters public String getNombre() { return nombre; } public double getPeso() { return peso; } public double getAltura() { return altura; } public Date getFechaNacimientoOriginal() { return new Date(fechaNacimientoOriginal.getTime()); } public Date getFechaNacimiento() { return new Date(fechaNacimiento.getTime()); } public String getEstado() { return estado; } // Setters protegidos (para uso por subclases) protected void setPeso(double peso) { this.peso = peso; } protected void setAltura(double altura) { this.altura = altura; } protected void setEstado(String estado) { this.estado = estado; } public void setFechaNacimiento(Date fechaNacimiento) { this.fechaNacimiento = new Date(fechaNacimiento.getTime()); } // Método clone con copia profunda public Object clone() { try{ EntidadBiologica copia = (EntidadBiologica) super.clone(); copia.fechaNacimientoOriginal = new Date(this.fechaNacimientoOriginal.getTime()); copia.fechaNacimiento = new Date(); // la fecha del clon es hoy return copia; }catch(CloneNotSupportedException e){return null;} } // Método abstracto a implementar por subclases public abstract void aplicarExperimento(double resultado); // toString muestra información de la especie public String toString() { String nombreMostrar = nombre; // Si fechas son iguales, no es clon, en caso contrario, es clon. if (!fechaNacimiento.equals(fechaNacimientoOriginal)) { nombreMostrar += " Clon"; } return "Especie: " + this.getClass().getName() + "\n" + "Nombre: " + nombreMostrar + "\n" + "Altura: " + altura + "\n" + "Peso: " + peso + "\n" + "Estado: " + estado + "\n" + "Fecha nacimiento original: " + String.format("%tF", fechaNacimientoOriginal) + "\n" + "Fecha nacimiento individuo: " + String.format("%tF", fechaNacimiento); } }