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 , NotOverridable o Overridable |
Uso de palabras clave | Se recomienda Shadows en una clase derivada; se supone Shadows si no se especifica Shadows ni Overrides 2 |
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
, Operator
o 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
, Sub
o 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.