Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Al definir una clase que hereda de una clase base, a veces quiere volver a definir uno o varios de los elementos de clase base de la clase derivada. Las funciones de sombrear y reemplazar están disponibles para este fin.
Comparación
Se usan las funciones de sombrear y reemplazar cuando una clase derivada hereda de una clase base y las dos redefinen un elemento declarado con otro. Pero hay diferencias significativas entre los dos.
En la tabla siguiente se comparan las funciones de sombrear y reemplazar.
| Punto de comparación | Sombreado | Invalidación |
|---|---|---|
| Propósito | Protege contra una modificación posterior de la clase base que introduce un miembro que ya ha definido en la clase derivada. | Logra el polimorfismo definiendo una implementación diferente de un procedimiento o propiedad con la misma secuencia de llamada1 |
| Elemento redefinido | Cualquier tipo de elemento declarado | Solo un procedimiento (Function, Sub, o Operator) o propiedad |
| Redefinir elemento | Cualquier tipo de elemento declarado | Solo un procedimiento o propiedad con la secuencia de llamada idéntica1 |
| Nivel de acceso del elemento redefinido | Cualquier nivel de acceso | No se puede cambiar el nivel de acceso del elemento invalidado |
| Legibilidad y escritura del elemento redefinidor | Cualquier combinación | No se puede cambiar la legibilidad ni la escribibilidad de la propiedad reemplazada |
| Control sobre la redefinición | El elemento de clase base no puede aplicar ni prohibir el sombreado | El elemento de clase base puede especificar MustOverride, NotOverridableo Overridable |
| Uso de palabras clave | Se recomienda Shadows en una clase derivada; se supone Shadows si no se especifica Shadows ni Overrides2 |
Overridable o MustOverride necesario en la clase base; Overrides necesario en la clase derivada |
| La herencia de redefinir un elemento por clases derivadas de la clase derivada | Elemento de sombreado heredado por clases derivadas adicionales; Elemento sombreado todavía oculto3 | Se reemplaza un elemento heredado por clases derivadas adicionales, el elemento reemplazado sigue reemplazado |
1 La secuencia de llamada consta del tipo de elemento (Function, Sub, Operatoro Property), nombre, lista de parámetros y tipo de valor devuelto. No puede reemplazar un procedimiento con una propiedad ni a la inversa. No se puede invalidar un tipo de procedimiento (Function, Subo Operator) con otro tipo.
2 Si no especifica ni Shadows ni Overrides, el compilador emite un mensaje de advertencia para que esté seguro de qué tipo de redefinición desea usar. Si omite la advertencia, se usa el mecanismo de sombreado.
3 Si el elemento de sombreado no es accesible en una clase derivada adicional, no se hereda el sombreado. Por ejemplo, si declara el elemento sombreado como Private, una clase derivada de su clase derivada hereda el elemento original en lugar del elemento sombreado.
Directrices
Normalmente, se usa la función de reemplazar en los siguientes casos:
Está definiendo clases derivadas polimórficas.
Se busca la seguridad que proporciona el compilador al aplicar el tipo de elemento idéntico y la secuencia de llamada.
Normalmente, se usa el sombreado en los casos siguientes:
Anticipa que su clase base podría modificarse y define un elemento usando el mismo nombre que el suyo.
Se busca la libertad de cambiar el tipo de elemento o la secuencia de llamada.