Supongamos que, en el desarrollo de un sistema de sueldos, un diseñador de software orientado a objetos nos presenta un diagrama de clases que, como subclases de Empleado ha definido dos clases, una EmpleadosVarones y otra EmpleadosMujeres. ¿Podemos decir que este planteo es siempre correcto? ¿Podemos decir que es siempre incorrecto? O, en caso de que las dos respuestas anteriores hayan sido negativas, ¿puede explicar en que caso/s consideraróa correcto dicho diseño?
Selección Múltiple: Se deben elegir todas las opciones correctas. Justificar.
La relacion entre “el perro de mi vecina Carlota” y “perro” es:
Explique el mecanismo de recolección de basura. ¿Qué ventajas e inconvenientes le encuentra comparándolo con un esquema en la que la destrucción de los objetos se hace mediante la llamada explícita a un metodo destructor? ¿Qué ejemplos de lenguajes conoce que manejen cada mecanismo?
Codificación y diagrama de clases:
public static String[] convertir(Objetc[] v,Stringator s);
que debe permitir hacer lo mismo, pero no utilizando el toString() de Object, sino el definifo para el objeto s. Stringator es una interfaz cuyo único método es uno cuya signatura es
String toString(Object o);
y convierte en cadena de caracteres al objeto o.
public interface InterfazPunto { public double getX(); public double getY(); public void setX(double valor); public void setY(double valor); }
La conversión a String debe hacerse como en el ejemplo que sigue: ”(x = 1.2; y = 2.3)“
Finalmente, hacer un diagrama de clases que muestre la solucion implementada.
En el caso de que el EmpleadoVaron y EmpleadoMujer tengan comportamientos diferentes tendria sentido tener esta distinción de clases de lo contrario no.
Opción correcta: Instanciación
En codigo seria
Perro p_carlota = new Perro("Carlota");
El mecanismo de recolección de basura se ocupa de verificar los objetos a los que no hay referencias apuntandolos y los elimina de la memoria. Comparando con la autorización de destructor, el recolector ayuda a generar un código mas limpio y aumenta la velocidad de desarrollo delegando el borrado de memoria al recolector. A nivel de la performance del software el recolector es eficiente cuando puede actuar en tiempos muertos del programa (cuando se esperan datos de entrada por teclado por ejemplo). Cuando en el programa no hay tiempos muertos donde el recolector pueda actuar, la complejidad de la tarea de recolección termina afectando la eficiencia del programa y en este caso puede ser conveniente utilizar destructores.
public class VectoresCadenas { public static String[] convertir(Object[] v){ String[] aux=new String[v.length]; for(int i=0;i<v.length;i++){ aux[i]=v[i].toString(); } return aux; } public static String[] convertir(Object[] v, Stringator s){ String[] aux=new String[v.length]; for(int i=0;i<v.length;i++){ aux[i]=s.toString(v[i]); } return aux; } }
public interface Stringator { public String toString(Object o); }
public class PuntoStringator implements Stringator { public String toString(Object o) { Punto p=(Punto)o; return p.toString(); } }
public interface InterfazPunto { public double getX(); public double getY(); public void setX(double valor); public void setY(double valor); }
public class Punto implements InterfazPunto { private double x,y; public Punto(double x,double y){ setX(x); setY(y); } public double getX() { return x; } public void setX(double x) { this.x = x; } public double getY() { return y; } public void setY(double y) { this.y = y; } public String toString(){ return new String("(x="+getX()+";y="+getY()+")"); } }
public class Principal { public static void main(String[] args) { Punto[] puntos=new Punto[10]; for(int i=0;i<10;i++){ puntos[i]=new Punto(i,i*0.1); } PuntoStringator ps=new PuntoStringator(); VectoresCadenas.convertir(puntos,ps); /* Esto es un agregado para verificar que funciona String[] s=VectoresCadenas.convertir(puntos,ps); for(int i=0;i<10;i++){ System.out.println(s[i]); } */ } }