Java sin herencia de implementación

7

En un video reciente en Java, Joshua Bloch declara a los 4 minutos y 20 segundos del video:

  

Y luego está la herencia, y eso era una necesidad de marketing. Sabes, podemos argumentar si realmente necesitas herencia de implementación o no.

Así que me pregunté: ¿cómo se vería Java sin herencia de implementación? Por ejemplo, ¿cómo funcionan equals , hashCode y toString ? ¿Java habría necesitado algo como mixins en su lugar?

    
pregunta fredoverflow 09.08.2011 - 21:23

5 respuestas

4

Con una API pública adecuada, puedo ver algo como los métodos de extensión .net que cumplen una gran parte del mismo propósito.

public static boolean equals(this Object that, Object other) {
  return (this == other);
}

Obviamente, se necesitaría un cambio de idioma, pero se podría reutilizar mucho con una sintaxis muy similar a la que tenemos hoy.

    
respondido por el Ken Brittain 09.08.2011 - 21:46
4

Para su ejemplo particular, ¿qué hay de usar simplemente funciones que toman el objeto como argumento en su lugar?

toString(Object obj)
hash(Object obj)
equals(Object a, Object b)

Creo que la gente tiende a ser bastante extremista en lo que "piensan" es increíble o catastrófico.

Seamos objetivos. La herencia es útil en muchos casos. No es una "necesidad" pero es bastante útil en algunos casos. Sin embargo, sí, tiende a ser sobreutilizado / promocionado y, a veces, introduce complejidad donde no debería.

¿Podemos vivir sin herencia en los lenguajes de programación convencionales? Realmente no. Son un constructo esencial y útil. Hacerse sin ellos sería un dolor en el culo.

¿Podemos encontrar otros mecanismos que sean mejores que la herencia? Seguramente. La herencia individual es muy limitada, la herencia múltiple es una hoja de dos caras. Pero la herencia en sí misma podría no ser la mejor ruta del todo. Una forma son los rasgos como en Scala, las clases como en Haskell (nada que ver con las clases normales), y muchos otros mecanismos.

Sin embargo, uno podría ir aún más lejos y pregunta si los "objetos" son el camino a seguir en nuestro mundo moderno. Quizás algo con tipos de datos algebraicos y agentes asíncronos encajaría mejor con los desafíos del paralelismo masivo y la expresividad en los lenguajes de programación. (Sí, lo sé, esto suena como un mumbo-jumbo académico, pero en realidad hay cosas muy concretas detrás de él).

    
respondido por el dagnelies 09.08.2011 - 22:07
3

Google's go es un ejemplo de un lenguaje que elimina la herencia de implementación mientras está en POO, es compatible con el polimorfismo y pertenece a su pregunta, interfaces compuestas.

Creo que el mayor problema con la herencia de implementación es el siguiente: Considere una clase de pila que podría implementarse usando una clase de cola. Podría hacerlo de dos maneras, una manera sería derivar la Pila de la Cola y agregar los métodos push () y pop (). El otro sería incrustar una instancia de cola dentro de una pila y usarla para implementar push () y pop (). En general, se prefiere lo último, por lo que la clase "contrato" nunca se confunde. Por otro lado, incrustar una instancia dentro de otra sería una buena manera de lograr la reutilización del código sin estropear el contacto de la clase.

El contrato de clase por otro lado (su interfaz) debe ser compostable o sujeto a herencia.

    
respondido por el ritesh 10.08.2011 - 06:16
0

No puedo ver que sea un lenguaje tan purista como para deshacerse de la herencia única, luego corregirlo permitiendo mezclar (herencia de implementación múltiple).

Buen punto sobre equals, hashCode y toString, supongo que tendrían el valor predeterminado del compilador en la implementación o bien las herramientas de todos tendrían (derrotando de alguna manera las motivaciones puristas).

Dado que las subclases se convertirían básicamente en decoradores, imagino que las herramientas de soporte para decoradores se convertirían en una gran prioridad. Es posible que nunca se sepa si al final del día las cosas se volverían más puras o las personas simplemente cortarían y pegarían la herencia.

    
respondido por el psr 09.08.2011 - 22:07
0

El polimorfismo es el fin, la herencia es un medio. Es uno que es bastante fácil de entender y creo que es bastante útil. En Java, soy un gran fan del patrón de método de plantilla que generalmente evita la necesidad de invocar super . Cada vez que invoco super en Java, me siento un poco sucio por alguna razón.

    
respondido por el jiggy 09.08.2011 - 22:41

Lea otras preguntas en las etiquetas