2010-03-10 11 views
7

Hace poco encontré una situación en algún código en el que estoy trabajando que no tiene sentido para mí. Un conjunto de clases hereda de una clase base puramente para compartir algunos métodos en la clase base. No hay método que anule, solo métodos de llamadas de clases secundarias de la clase principal.Uso de herencia puramente para compartir funcionalidad común

Me parece que esto se modelaría mejor haciendo que las clases secundarias hagan referencia a la clase principal en lugar de heredar, lo que creo que reduciría la complejidad innecesaria. ¿Es esto razonable o me falta algún beneficio de usar una herencia como esta?

+2

Estás en lo correcto. –

Respuesta

3

Si los métodos de la clase padre están allí puramente como 'utilidades', entonces sí, estoy de acuerdo.

La pregunta (al menos para mí) sería si la clase principal podría modificarse en el futuro para obtener un beneficio. Es decir, ¿cuál es la relación actual lógicamente? Si es un "es un" entre el niño y el padre, entonces déjelo. Si el padre es solo una colección de métodos, refactorícese a una clase de utilidad o use delegación.

3

Estás en la correcta. Desafortunadamente, la herencia se usa mucho cuando en realidad no es necesaria.

Si no hay una relación entre el niño y la clase principal, entonces no se debe usar la herencia.

0

Supongo que la herencia que puede observar es solo el resultado de la refactorización.

+0

No es el mejor tipo de refactorización, ya que no aumenta la legibilidad ;-) – gruszczy

+0

De todos modos, es mucho mejor que copiar/pegar código que era antes de esta refactorización. – Roman

3

La herencia se puede utilizar (¡y abusar!) De diferentes maneras. Aquí están las tres categorías grandes.

jerarquía conceptual:

clases conceptualmente relacionados pueden ser organizados en una especialización jerarquía:

  • personas, empleados, gerentes objetos
  • geométricas ...

Polimorfismo:

objetos de distintos, pero relacionados clases pueden ser tratados de manera uniforme por clientes

  • matriz de objetos geométricos de reutilización

Software:

Las clases relacionadas pueden compartir interfaces, estructuras de datos o comportamiento.

  • objetos geométricos ...

Para un estudio completo de las diferentes formas de herencia, leer On the notion of inheritance.

El caso que menciona, es reutilización del software. No hay es una relación, a lo sumo tiene una relación. El objetivo es principalmente reutilizar el mismo código.

Como sugiere, esto se puede refactorizar con la delegación , o incluso en una clase de utilidad, el método es esencialmente estático.

Cuestiones relacionadas