2010-03-16 10 views
8

Estoy interesado en la comprensión de la programación orientada a objetos en una forma más académica y el resumen de lo que actualmente hago, y me gustaría saber si hay algún conceptos orientados a objetos Java y C++ no apliquen.¿Faltan las características de OO en Java o C++?

que se dan cuenta de que ninguno de los idiomas son "pura" OO, pero estoy interesado en lo que (si acaso) que les falta, no lo que tienen extra.

+16

Eso implicaría que usted deletreara lo que quiere decir con "OO". –

+2

Creo que el punto es que OP no * sabe * exactamente lo que significa y quiere algo en expansión mental. – Ken

Respuesta

1

Java no tiene herencia múltiple, pero algunos podrían decir que esto es más una bendición, ya que obliga a los usuarios a pensar en la arquitectura correcta. Puede usar interfaces y clases abstractas para evitar esto.

La herencia múltiple ha sido criticado por los siguientes problemas que causa en algunos idiomas, en particular, C++:

  • ambigüedad semántica resume a menudo como el diamond problem.
  • No ser capaz de heredar explícitamente varias veces desde una sola clase
  • Orden de la herencia cambie de clase semántica
+0

@Chris Dennett: esto simplemente no es cierto. La implementación es un detalle y debes saber que puedes * trivialmente * traducir * cualquier * OOA/OOD usando * cualquier * herencia múltiple loca muy limpiamente en Java (como lo puedes hacer en un lenguaje que ni siquiera tiene el concepto de implementación) herencia) usando herencia de interfaz múltiple. Probablemente esté confundido con la "reutilización del código", que puede lograr trivialmente utilizando la delegación. La base de código Java 200KLOC aquí donde estamos usando exactamente la herencia de implementación * zero * time ... Y donde usamos herencia múltiple * en todas partes *. – SyntaxT3rr0r

+0

Ahora estás aburrido. Ya mencioné esto. –

+1

OK, WizardOfOdds, Java falta la delegación de la interfaz.Si quieres que una clase delegue la interfaz I al objeto O, tienes que crear manualmente todos los métodos de I que llamen trivalmente a los mismos métodos de O. – Gabe

0

Java y C++ ambos permiten la programación de procedimiento. Eso se puede considerar como un inconveniente para algunas personas.

+1

De hecho, argumentaría que la mayoría del código Java/C++ * es * procedural , con una chapa de OO en él. – kyoryu

1

Java: Los tipos primitivos no son objetos.

+1

No es una característica que falta, es una idiosincrasia de diseño de lenguaje. – Benson

+1

Bueno, algunas personas (yo) llaman a los errores de características que faltan :) –

+1

No se puede escribir 'class MyInt: public int' en C++ tampoco. No si quieres compilar, de todos modos. –

15

En the words of Alan Kay, el inventor de la expresión "orientación a objetos":

OOP me significa que sólo mensajería, retención local y la protección y ocultar de estado-proceso, y extremo tarde vinculante de todas las cosas. Puede ser hecho en Smalltalk y en LISP. Hay son posiblemente otros sistemas en los que esto es posible, pero no estoy al tanto de ellos.

C++ obviamente no supera el criterio de "extrema unión tardía", y tanto Java como C++ no cumplen el criterio de "mensajería", debido a su rígida estructura de clase/método. Según tengo entendido, el concepto de Kay considera que los métodos con un nombre específico y una firma son una forma conveniente de implementar manejadores de mensajes, pero de ninguna manera son los únicos.

Otras declaraciones interesantes desde el mismo correo electrónico:

no me gustaba la forma en Simula I o Simula 67 hizo la herencia [...] Así que decidieron dejar de lado la herencia construida como un -en la característica hasta que lo entendí mejor.

y

El término "polimorfismo" se impuso mucho más tarde (creo por Peter Wegner) y no es muy válida, ya que realmente viene de la nomenclatura de las funciones, y Yo quería un poco más que funciones.

+1

¿No Java también falla el criterio anterior? – Ken

+0

¿Qué otros idiomas dirías hoy que satisfacen los criterios de "extremo apego tardío"? ¿Todavía solo Smalltalk y LISP? – FrustratedWithFormsDesigner

+0

FWFD: Creo que Ruby calificaría en ese aspecto. – Ken

2

Hay otra forma de pensar acerca de la programación orientada a objetos que difiere del sistema basado en clases en Java y C++. La programación basada en prototipos es utilizada por JavaScript. Si desea ver toda la gama de estilos OOP, probablemente valga la pena echarle un vistazo a: http://en.wikipedia.org/wiki/Prototype-based_programming

3

Ambos hacen una distinción entre primitivos y objetos, por lo que ninguno de ellos está orientado a objetos.

+1

@JRL: de ninguna manera "carece de una función" y la pregunta en particular establece que el póster * sabe * que C++ y Java no son lenguajes OO puros. – SyntaxT3rr0r

0

La mayoría de los idiomas interpretados cumplen con los requisitos de vinculación tardía. En Perl puede extraer el código de una tabla de base de datos, colocarlo en el intérprete y luego crear una instancia de los objetos de la nueva clase que acaba de introducir en el programa.

¿Cumple Python con la definición de OOP de Kay? No he hecho suficiente trabajo en Python para estar seguro. Sospecho que no, ya que Python tiene 'tipos nativos' que no son objetos.

+0

¿A qué "tipos nativos" se está refiriendo? No he encontrado nada en Python que no sea un objeto. – Benson

+1

Estoy parado. Del tutorial en DiveIntoPython.org: "2.4.2. ¿Qué es un objeto? todo en Python es un objeto, y casi todo tiene atributos y métodos." probablemente estaba pensando en las variables normales, que no tienen ningún atributo por defecto. Siguen siendo objetos. Yay Python. – Wexxor

1

La característica más importante de la programación orientada a objetos es el encapsulado. Ocultar los detalles de implementación es obviamente crucial para escribir código que se pueda mantener.

En C++, como tiene punteros no controlados, es posible que un objeto mal escrito literalmente haga cualquier cosa con otro. Esto significa que la encapsulación está rota, y que los errores son difíciles de encontrar.

Java no tiene ese problema, pero carece de const-sidad básica. Eso no es estrictamente una característica teórica orientada a objetos, pero poder declarar que un método es de solo lectura, o que un objeto es de solo lectura, es un potenciador de confiabilidad fantástico en C++ que no está en Java.

Por último, el mecanismo de plantilla de java es una imitación pálida de C++. No poder parametrizar las clases es una gran pérdida para Java.

Dado que Java no admite punteros a los métodos, y la reflexión es demasiado lenta, obliga al uso de muchos objetos pequeños cuando un puntero a la función lo haría. Algunos pueden considerar que es algo bueno.

Cuestiones relacionadas