Composición vs. Herencia y Otros Conceptos Clave en Programación Orientada a Objetos

Clasificado en Informática

Escrito el en español con un tamaño de 5,18 KB

Composición vs. Herencia

Composición: Se usa generalmente cuando se quieren las características de una clase, pero no en su interfaz. Se ve la interfaz de la clase, pero no de la original. Es más flexible y se define dinámicamente en tiempo de ejecución.

Herencia: No puede cambiarse, es estática, viola el encapsulamiento e importa la estructura a las subclases. Permite una definición más escueta de la clase y es ligeramente más eficaz que la composición.

Genericidad vs. Herencia

Genericidad: Permite rehusar código fuente y crear una familia completa de clases o funciones.

Herencia: Permite rehusar código objeto y es necesario codificar cada una de las clases involucradas.

Uso de la Herencia en Implementación

Uso Seguro

La redefinición de métodos solo debería usarse para hacer las propiedades más específicas:

  • Constreñir restricciones: Extender funcionalidad.
  • Dos definiciones para clases derivadas:
    • Una clase derivada es una especialización de la clase base: añade comportamiento y restringe condiciones de uso, pero no modifica nada.
    • Una clase derivada es una especificación de la clase base: define métodos indefinidos por el padre, no añade ni elimina nada.

Uso Inseguro

  • Herencia de restricción: No todo lo del padre sirve al hijo, ahorro de código, pero problema de mantenimiento.
  • Herencia de generalización: Muy usual cuando no se puede tocar la clase padre.
  • Herencia de conveniencia: La implementación se parece a una herencia, pero semánticamente los conceptos no tienen nada que ver, uso incorrecto.

Herencia

Es transitiva, permite la reutilización de código y de conceptos. Implementa la relación de generalización (mecanismo de reutilización de código), pertenencia (tiene_un), variedad (es_un).

Modificar lo Heredado

  • Refinar (usar método antiguo):
    • Explícita: Usar el antiguo en el nuevo código para invocar a un constructor que no sea el de por defecto.
    • Implícita: El destructor de la derivada llama al de la base.
  • Sobreescribir

this: Variable polimórfica, puntero que referencia al objeto que invoca al método. Contiene la dirección y el objeto this, no puede variar su dirección, solo en métodos de instancia, está implícito. Si se pone const, es constante.

Herencia de construcción (herencia de implementación pura): La herencia privada en C++ implementa un tipo de herencia que sí preserva el principio de sustituibilidad.

Alteración y Sobrecarga

Coherción:

  • Estándar: double + int
  • Definida: Sobrecarga de constructores.

Conversión (explícita): Sobrecarga de operadores como métodos de clase (double(){return sqrt(pow(x, 2.0) + pow(y, 3.0));}). double coordenada + 7,0

Visibilidad de los Atributos

Permite preservar el principio de encapsulación. Encapsulación: Mecanismo que permite separar Interfaz de Implementación.

UML

Tiene una sola implementación válida y siempre para un lenguaje concreto.

Errores:

  • Logic_error: domain_error, invalid_argument, length_error (objeto muy grande para ser definido), out_of_range.
  • Runtime_error: range_error: valor definido, pero no representativo, overflow, underflow.

Propiedad en C#

Es una combinación de atributo y operaciones de lectura/escritura sobre ese atributo.

Operadores:

  • FM: = [] () new delete ->
  • FNM: << >>
  • Ambas y demás, no se puede cambiar precedencia, asociatividad ni aridad.

Polimorfismo

Sobrecarga, polimorfismo en herencia: redefinición, shadowing, sobreescritura.

Variables polimórficas: Lenguajes débilmente tipados, fuertemente tipados.

Tipos:

  • Upcasting: Polimorfismo simple (subtipos diferentes).
  • Polimorfismo puro: Variable polimórfica como método de un argumento.
  • Downcasting: Polimorfismo inverso.

Genericidad

Propiedad que permite definir una clase o función sin especificar el tipo de alguno o todos los parámetros:

  • Sin restricción: No imposición sobre los tipos que pueda adoptar los parámetros genéricos formales (restricción que imponga el propio cuerpo de plantilla).
  • Con restricción (Eiffel): Permite que la legalidad de los argumentos se verifique en tiempo de compilación.

Entradas relacionadas: