2011-03-29 15 views
5

Digamos que tienes una clase Shape base y diversos tipos derivados: Circle, etc.upcasting al hacer objeto

¿Hay alguna razón para upcast allí mismo al hacer un nuevo objeto, escribiendo esto:

Shape s = new Circle(); 

en lugar de esto:

Circle s = new Circle(); 

y son los s objetos realizados por cada uno de estos dos estados de un modo diferente el uno del ¿otro?

Respuesta

3

Esas dos declaraciones producirán el mismo objeto en lo que se refiere a la JVM. No es raro mostrar que solo planea usar el objeto para la clase base o la interfaz. P.ej. esto es común:

List<String> list = new ArrayList<String>(); 

Aunque por lo general no es una buena idea, que puede emitir el Shape de nuevo en un Circle si se sabe con certeza que se trata de uno, por ejemplo, con Shape s puede traer de vuelta a un Circle c con:

if (s instanceof Circle) { 
    Circle c = (Circle) s; 
    // handle Circle case 
} 
0

No, los objetos mismos no son diferentes. Solo lo que el compilador cree que está viendo es diferente (por ejemplo, qué métodos están disponibles).

Una razón para hacer un reparto como este es expresar cómo te gusta tratar el objeto (para que puedas insertar fácilmente una clase derivada diferente en su lugar).

-2

Círculo s = nuevo Círculo();
aquí el objeto se refiere a la clase Cricle

Forma s = new Circle(); aquí objeto que se refiere a la interfaz

Ambos son iguales.

3

Puede argumentar que su primer ejemplo (es decir, Shape s = new Circle();) puede tener las mismas ventajas que "codificar en la interfaz" aunque Shape podría ser una clase base abstracta o incluso concreta. Entonces, por ejemplo, si solo usa los métodos definidos en Shape y no los específicos para Circle, entonces puede simplemente cambiar la implementación que está utilizando a Square por ejemplo simplemente cambiando una línea de código, es decir, Shape s = new Square();.

Los objetos son los mismos en ambos ejemplos, la razón por la cual la primera opción se puede considerar mejor es más de estilo. La codificación de las interfaces puede hacer que una base de código sea más fácil de ampliar y modificar.

1

El objeto instanciado es exactamente el mismo.

Las consecuencias de un upcasting son:

  1. generalización mientras que el almacenamiento: todos los objetos de diferente tipo especializado se pueden threated como la misma interfaz y se pueden almacenar juntos en la estructura de datos.(Como se señala en @ WhiteFang34: List < Shape>)
  2. método de generalización al acceder a objetos: la clase de cliente puede llamar al método de Shape sin conocer el tipo real (normalmente puede usar una fábrica para crear objetos que devuelve la interfaz común). , por lo que la clase del cliente desconoce el tipo real de los objetos, pero solo los métodos de la interfaz de la forma están expuestos)
1

En respuesta a su pregunta, los dos objetos son exactamente iguales. Ambas referencias podrían apuntar al mismo objeto:

Circle c = new Circle(); 
Shape s = c; 

Codificación de las interfaces le permite cambiar la clase de implementación con un impacto mínimo en su código. Digamos que tiene esto:

Set<String> names = new HashSet<String>();   // using Set reference not HashSet 
names.add("Frank"); 
names.add("John"); 
names.add("Larry"); 

for(String name: names) { 
    System.out.println(name + " is in the team"); 
} 

Ahora sus necesidades cambian y desea que los nombres que se imprimirán en orden alfabético, es decir utilizar HashSet en lugar de TreeSet. Debido a que usted ha codificado a la interfaz y no se utiliza ningún método específico para la clase HashSet es suficiente con cambiar una línea:

Set<String> names = new TreeSet<String>(); // the only line of code that changes 
names.add("Frank"); 
names.add("John"); 
names.add("Larry"); 

for(String name: names) { 
    System.out.println(name + " is in the team"); 
} 

Las interfaces también le permiten usar la inyección de dependencia. Le permite usar clases que quizás ni siquiera existan en el momento de escribir su código.

http://en.wikipedia.org/wiki/Dependency_injection