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.